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

파일에 이전에 텍스트가 있었고 새로 작성된 텍스트가 이미 파일에있는 텍스트보다 짧은 경우 파일의 쓸모없는 후미 콘텐트가 잘리지 않도록하려면 어떻게해야합니까?FileStream 및 StreamWriter - 작성한 후 파일의 나머지 부분을 자르는 방법?

이 경우 파일을 자르기 모드로 여는 것은 옵션이 아닙니다. 이 파일은 FileStream 개체를 받으면 이미 열려 있습니다. 위의 코드는 스트림의 속성을 설명하기위한 것입니다.

편집

아래의 대답에 확장 솔루션입니다 : 내가 그 일을 얼마나 잘 모르겠어요하지만

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

이 코드는 파일이 1MB를 초과하면 로그 파일의 일부를 자릅니다.

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(); 
     } 
    } 
관련 문제