Ответ 1
Используйте SetLength
, чтобы установить новую длину файла - файл должен быть усечен.
См. этот ответ по соответствующему вопросу.
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
writer.Write(....);
Если файл, ранее содержащий текст и ново написанный текст, был короче, чем тот, что уже был в файле, как я могу урезать устаревший конечный контент в файле?
Обратите внимание, что открытие файла в режиме усечения не является вариантом в этом случае. Файл уже открыт, когда я получаю объект FileStream
. Вышеприведенный код просто иллюстрирует свойства потока.
ИЗМЕНИТЬ
Развернув ответ ниже, решение:
var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
using(var writer = new StreamWriter(fs))
{
writer.Write(....);
writer.Flush();
fs.SetLength(fs.Position);
}
Используйте SetLength
, чтобы установить новую длину файла - файл должен быть усечен.
См. этот ответ по соответствующему вопросу.
вы можете попробовать writer.BaseStream.SetLength(writer.BaseStream.Position)
, хотя я не уверен, насколько хорошо это сработает.
Для FileStream я думаю, что это должно усечь файл в текущую позицию.
Этот код обрезает часть файла журнала, если файл растет выше 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();
}
}