使用Stream的API在C#中修改文件内容

时间:2018-10-08 09:04:57

标签: c# file stream

我有一个处理用户角色的.json文件,我写了一个资料库,负责向用户添加/删除角色。 pb是我修改文件时要确保没有人可以访问它。

(大致)这是我使用的代码:

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 :(得分:1)

您可以执行fileStream.SetLength(fileStream.Position)截断文件的其余部分。假设FileStream在使用后已正确放置StreamWriter,但这是假设您的当前代码似乎也正在这样做。

(这是一个比StreamReader的相应用法更安全的假设,其中内部缓冲可能意味着基础流的位置比通过调用Read方法返回的最新数据更高级)< / p>