Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么streamwriter在文件的一半中写入而不是覆盖_C#_File_Filestream - Fatal编程技术网

C# 为什么streamwriter在文件的一半中写入而不是覆盖

C# 为什么streamwriter在文件的一半中写入而不是覆盖,c#,file,filestream,C#,File,Filestream,这是我的原始文件 [ { "Quantity": 34, "ShopOrderId": "51e400ff-76b8-4be4-851a-86e2681db960", "Id": "ae7664cb-135e-4c01-b353-5ecf09ac56af", "Direction": 2 }, { "Accepted

这是我的原始文件

[
  {
    "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, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
    using (var streamWriter = new StreamWriter(fs))
    {
        var json = JsonConvert.SerializeObject(result, Formatting.Indented);
        streamWriter.Write(json);
    }
}
所以它是有效的

但由于某种原因,在执行Write之后,情况变得一团糟

[
  {
    "Accepted": true,
    "Id": "7bfc2163-2274-4a0e-83b9-203cb376a8f8",
    "Direction": 1
  }
]-135e-4c01-b353-5ecf09ac56af",
    "Direction": 2
  },
  {
    "Accepted": true,
    "Id": "7bfc2163-2274-4a0e-83b9-203cb376a8f8",
    "Direction": 1
  }
]
如何使streamWriter真正覆盖,以及为什么在打开新文件流时会发生这种情况?它不应该不知道以前使用streamReader的操作吗?我想这就是为什么它不是从索引0开始的原因


或者,可能有一种更简单的方法可以在使用锁阻止其他程序修改的同时读取/写入文件?

听起来,当您打开文件进行覆盖时,您需要使用文件模式。

听起来,当您打开文件进行覆盖时,您需要使用文件模式。

也许您想要第二个文件流相反?@John哦,似乎有用,谢谢。请把它写下来作为答案,这样我就可以接受你想要的第二个文件流了吗?@John-oh,看起来不错,谢谢。请把它写下来作为答案,这样我就可以接受我用过的文件模式了
[
  {
    "Accepted": true,
    "Id": "7bfc2163-2274-4a0e-83b9-203cb376a8f8",
    "Direction": 1
  }
]-135e-4c01-b353-5ecf09ac56af",
    "Direction": 2
  },
  {
    "Accepted": true,
    "Id": "7bfc2163-2274-4a0e-83b9-203cb376a8f8",
    "Direction": 1
  }
]