2011-12-11 27 views
16
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 
using(var writer = new StreamWriter(fs)) 
    writer.Write(....); 

ファイルに以前にテキストが含まれていて、新しく書き込まれたテキストがファイル内のテキストよりも短い場合は、ファイル内の古いコンテンツが切り捨てられていることを確認するにはどうすればよいですか?FileStreamとStreamWriter - 書き込み後に残りのファイルを切り詰めるには?

この場合、ファイルを切り捨てモードで開くことはオプションではありません。このファイルは、FileStreamオブジェクトを受け取った時点で既に開いています。上記のコードは、ストリームのプロパティを示すためのものです。

EDIT

以下の答えを拡張し、解決策は次のとおりです。私はそれがうまくいく方法もわからないが、

var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 
using(var writer = new StreamWriter(fs)) 
{ 
    writer.Write(....); 
    writer.Flush(); 
    fs.SetLength(fs.Position); 
} 
+1

答え/ソリューションコードは私に間違っになります読んfs.Position **前** writer.Flushまたはwriter.Dipose(と呼ばれた)は、あなたの本当のバイト数を与えることはありません。あなたが運があるのは、ストリームが自動的に書き込まれたときに自動的に展開されるからです。しかし、2回の長さの適用が1回の書き込みに適用されるため、ファイルが断片化してしまう可能性があります。 – springy76

答えて

13

SetLengthを使用して、ファイルの新しい長さを設定します。ファイルは切り捨てられます。

関連する質問this answerを参照してください。

+0

あなたが投稿したのと同時に回答が見つかりました。乾杯:) –

3

あなたがwriter.BaseStream.SetLength(writer.BaseStream.Position)を試みることができます。

FileStreamについては、ファイルを現在の位置に切り捨ててください。

1

このコードは、ファイルが1 MBを超えるとログファイルの一部を切り捨てます。

using (FileStream fs = File.Open("C:\\LogFile.txt", FileMode.OpenOrCreate)) 
     { 
      int OneMB = 1000000; 

      fs.Seek(0, SeekOrigin.Begin); 
      if (fs.Length > OneMB) 
      { 
       int fileByte = 1; 
       fs.Position = fs.Seek(fs.Length/2, SeekOrigin.Begin); 
       List<byte> bytes = new List<byte>(); 

       while (fileByte > 0) 
       { 
        fileByte = fs.ReadByte(); 
        bytes.Add((byte)fileByte); 
       } 

       fs.SetLength(0); 
       fs.Position = 0; 
       fs.Write(bytes.ToArray(), 0, bytes.Count()); 

       fs.Seek(0, SeekOrigin.End); 
       var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test1" + Environment.NewLine); 
       fs.Write(stringBytes, 0, stringBytes.Length); 
      } 
      else 
      { 
       fs.Seek(0, SeekOrigin.End); 
       var stringBytes = UTF8Encoding.ASCII.GetBytes($"Test2" + Environment.NewLine); 
       fs.Write(stringBytes, 0, stringBytes.Length); 
      } 

      fs.Flush(); 
     } 
    } 
関連する問題