问题描述
这是我的原始文件
[
{
"Quantity": 34,"ShopOrderId": "51e400ff-76b8-4be4-851a-86e2681db960","Id": "ae7664cb-135e-4c01-b353-5ecf09ac56af","Direction": 2
},{
"Accepted": true,"Id": "7bfc2163-2274-4a0e-83b9-203cb376a8f8","Direction": 1
}
]
// items loaded from file
var result = new List<QueueItem>();
using (var fs = new FileStream(Path,FileMode.OpenorCreate,FileAccess.ReadWrite,FileShare.Read))
{
// reading from file
using (var streamReader = new StreamReader(fs))
{
var json = streamReader.ReadToEnd();
result = JsonConvert.DeserializeObject<List<QueueItem>>(json) ?? new List<QueueItem>();
}
}
// removing unwanted items
result = result.Where(x => !IdsToRemove.Contains(x.Id)).ToList();
// overwriting whole file
using (var fs = new FileStream(Path,FileShare.None))
{
using (var streamWriter = new StreamWriter(fs))
{
var json = JsonConvert.SerializeObject(result,Formatting.Indented);
streamWriter.Write(json);
}
}
json
中 streamWriter.Write(json)
的值为
[
{
"Accepted": true,"Direction": 1
}
]
所以它是有效的。
但是由于某种原因,在执行 Write
之后它变得一团糟
[
{
"Accepted": true,"Direction": 1
}
]-135e-4c01-b353-5ecf09ac56af","Direction": 1
}
]
我怎样才能让我的 streamWriter
真正被覆盖,以及为什么在我打开新的 FileStream
时会发生这种情况?难道它不应该不知道以前对 streamReader
的操作吗?我想这就是它不从索引 0 开始的原因。
或者也许有更简单的方法在有锁的情况下从文件中读/写(防止其他程序修改?)
解决方法
听起来您在打开文件模式时需要使用 Truncate
来覆盖。