FileStream и StreamWriter - Как обрезать оставшуюся часть файла после записи? - PullRequest
18 голосов
/ 11 декабря 2011
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
    writer.Write(....);

Если в файле ранее содержался текст, а новый текст был короче того, что уже был в файле, как мне убедиться, что устаревшее конечное содержимое в файле обрезано?

Обратите внимание, что открытие файла в режиме усечения в этом случае не вариант. Файл уже открыт, когда я получаю объект 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);
}

Ответы [ 3 ]

15 голосов
/ 11 декабря 2011

Используйте SetLength для установки новой длины файла - файл должен быть усечен.

См. этот ответ на связанный вопрос.

3 голосов
/ 11 декабря 2011

вы можете попробовать writer.BaseStream.SetLength(writer.BaseStream.Position), хотя я не уверен, насколько хорошо это будет работать.

Для FileStream я думаю, что это должно усечь файл до текущей позиции.

1 голос
/ 16 марта 2017

Этот код будет обрезать часть файла журнала, если размер файла превысит 1 МБ.

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();
        }
    }
...