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

Nếu tệp trước đây có chứa văn bản và văn bản mới được viết ngắn hơn những gì đã có trong tệp, làm cách nào để đảm bảo rằng nội dung lỗi thời trong tệp bị cắt bớt?FileStream và StreamWriter - Làm thế nào để cắt bớt phần còn lại của tập tin sau khi viết?

Lưu ý rằng mở tệp ở chế độ cắt ngắn không phải là một tùy chọn trong trường hợp này. Tệp đã mở khi tôi nhận được đối tượng FileStream. Đoạn mã trên chỉ để minh họa các thuộc tính của luồng.

EDIT

Mở rộng trên câu trả lời dưới đây, giải pháp là:

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

Mã câu trả lời/giải pháp có vẻ sai với tôi: Đọc fs.Position ** trước khi ** được gọi là writer.Flush hoặc writer.Dipose() sẽ không cung cấp cho bạn số byte thực. Bạn có may mắn vì Luồng tự động mở rộng khi được ghi vào, nhưng tệp của bạn có thể bị phân đoạn không cần thiết do 2 điều chỉnh độ dài được áp dụng cho 1 lần ghi. – springy76

Trả lời

13

Sử dụng SetLength để đặt độ dài mới của tệp - tệp sẽ bị cắt bớt.

Xem this answer cho câu hỏi liên quan.

+0

Chỉ tìm thấy câu trả lời cùng một lúc bạn đã đăng nó. Chúc mừng :) –

3

bạn có thể thử writer.BaseStream.SetLength(writer.BaseStream.Position) mặc dù tôi không chắc chắn rằng sẽ làm việc tốt như thế nào.

Đối với một FileStream, tôi cho rằng nên cắt bớt tệp thành vị trí hiện tại.

1

Mã này sẽ cắt bớt một phần tệp nhật ký, nếu tệp lớn hơn 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(); 
     } 
    } 
Các vấn đề liên quan