【问题标题】:Modify a file content in C# using the Stream's API使用 Stream 的 API 在 C# 中修改文件内容
【发布时间】:2018-10-08 09:04:57
【问题描述】:

我有一个处理用户角色的 .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);
}

此解决方案的 pb 是,如果 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();
    }
}

它运作良好,但对我来说看起来不是很干净。有没有更好的解决方案可以确保我保持对文件的控制?

提前致谢, 托马斯

【问题讨论】:

  • 我不会说它不干净。我认为这段代码很安静。但是,如果您想要另一种解决方案,您可以删除该文件并创建一个具有相同名称的新文件。然后您确定文件中只有您的文本。
  • @Presi - 删除/创建可以是“活泼的”,因为没有办法在这两个步骤之间对名称保持“锁定”。截断文件的全部/部分是众所周知的操作,“挑战”是弄清楚它是如何在 .NET 中公开的。

标签: c# file stream


【解决方案1】:

您可以使用fileStream.SetLength(fileStream.Position)截断文件的剩余部分。这假设FileStream 在使用后被StreamWriter 正确定位,但这是您当前代码似乎也在做的假设。

(这是一个比StreamReader 的相应用法更安全的假设,其中内部缓冲可能意味着底层流的位置比调用Read 方法返回的最新数据更先进)

【讨论】:

  • 谢谢!那会是最终代码:fileStream.Seek(0, SeekOrigin.Begin); streamWriter.Write(newContent); streamWriter.Flush(); fileStream.SetLength(fileStream.Position); 吗?
  • 可以简化成这个代码:fileStream.Seek(0, SeekOrigin.Begin); fileStream.SetLength(0); streamWriter.Write(newContent); ?
猜你喜欢
  • 2014-03-24
  • 2018-07-19
  • 2022-08-10
  • 2012-11-24
  • 2014-06-13
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多