Изменить содержимое файла в C # с помощью API Stream - PullRequest
0 голосов
/ 08 октября 2018

У меня есть файл .json, который обрабатывает роли пользователя, и я написал репозиторий, который отвечает за добавление / удаление ролей для пользователей.ПБ в том, что когда я изменяю файл, я хочу быть уверен, что никто, кроме меня, не получит к нему доступ.

Вот (примерно) код, который я использую:

using (var fileStream = new FileStream(_rolesFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
using (var streamReader = new StreamReader(fileStream))
using (var streamWriter = new StreamWriter(fileStream))
{
    var oldContent = streamReader.ReadToEnd();
    var contentObject = Deserialize(oldContent);

    Modify(contentObject)

    var newContent = Serialize(contentObject);

    fileStream.Seek(0, SeekOrigin.Begin);
    streamWriter.Write(newContent);
}

ПБ с этимРешение состоит в том, что если newContent строка короче, чем oldContent, то некоторые символы будут оставаться в файле.

Решение, которое я нашел, заключается в добавлении следующего кода:

using (var fileStream = new FileStream(_rolesFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
using (var streamReader = new StreamReader(fileStream))
using (var streamWriter = new StreamWriter(fileStream))
{
    //...

    var newContent = Serialize(contentObject);
    var endPosition = fileStream.Position;

    fileStream.Seek(0, SeekOrigin.Begin);
    streamWriter.Write(newContent);
    streamWriter.Flush();

    while (fileStream.Position < endPosition)
    {
        streamWriter.WriteLine();
        streamWriter.Flush();
    }
}

Это работает хорошо, но не выглядит очень чистым для меня.Есть ли лучшее решение, обеспечивающее контроль над файлом?

Заранее спасибо, Томас

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете сделать fileStream.SetLength(fileStream.Position) до усекать оставшуюся часть файла.Это предполагает, что FileStream остается правильно позиционированным StreamWriter после использования, но это предположение, что ваш текущий код, похоже, делает тоже.

(Это более безопасное предположение, чем соответствующее использование StreamReader где внутренняя буферизация может означать, что позиция базового потока продвигается дальше, чем последние данные, возвращаемые при вызове метода Read)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...