FileStream FileMode.OpenOrCreate перезаписывает файл - PullRequest
0 голосов
/ 25 августа 2018

Документация гласит: FileMode.OpenOrCreate "указывает, что операционная система должна открывать файл, если он существует; в противном случае должен быть создан новый файл", который звучит так, как будто он откроет файл и запишет в него. Вместо этого файл кажется перезаписанным.

Как добавить файл, а не перезаписать его?

class Logger : IDisposable
{
    private FileStream fs;
    private StreamWriter sw;

    public Logger()
    {
        // Will create file if one does not exist, otherwise opens existing file
        fs = new FileStream("log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        sw = new StreamWriter(fs, Encoding.UTF8);
    }

    public void Log(string message)
    {
        sw.WriteLine(message);
        sw.Flush();
        fs.Flush();
    }

    public void Dispose()
    {
        sw?.Dispose();
        fs?.Dispose();
    }
}

1 Ответ

0 голосов
/ 25 августа 2018

Документация верна - но учтите, что open и append не являются синонимами.FileMode.OpenOrCreate не перезаписывает файл, но поток начинается с начала файла, если он уже существует.Вы наблюдаете, что содержимое перезаписывается StreamWriter, а не конструктором FileStream, перезаписывающим файл.

Вы должны переместить позицию потока в конец файладобавить текст в конце.Для этого вы можете переместить позицию с помощью FileStream.Seek() или изменить FileMode на FileMode.Append. Однако , использование FileMode.Append также требует сделать поток только для записи, а не для чтения-записи.

Вариант 1 (FileMode.OpenOrCreate, FileAccess.ReadWrite)

public Logger()
{
    // Will create file if one does not exist, otherwise opens existing file
    fs = new FileStream("log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
    // Set stream position to end-of-file
    fs.Seek(0, SeekOrigin.End);
    sw = new StreamWriter(fs, Encoding.UTF8);
}

Вариант 2 (FileMode.Append, FileAccess.Write)

public Logger()
{
    // Will create file if one does not exist, otherwise appends to existing file
    fs = new FileStream("log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
    sw = new StreamWriter(fs, Encoding.UTF8);
}
...