我有一个处理用户角色的.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();
}
}
它运作良好,但对我来说看起来并不干净。有什么更好的解决方案可以确保我控制文件?
预先感谢, 托马斯
答案 0 :(得分:1)
您可以执行fileStream.SetLength(fileStream.Position)
来截断文件的其余部分。假设FileStream
在使用后已正确放置StreamWriter
,但这是假设您的当前代码似乎也正在这样做。
(这是一个比StreamReader
的相应用法更安全的假设,其中内部缓冲可能意味着基础流的位置比通过调用Read
方法返回的最新数据更高级)< / p>