是否有可能在使用file . create的情况下追加文件
本文关键字:情况下 追加 文件 create file 有可能 是否 | 更新日期: 2023-09-27 18:01:45
我目前正试图理解我面临的一个问题。我有以下代码:
using (FileStream sw = File.Create(mypath))
{
sw.Write(source, 0, bytesRead);
sw.Flush();
}
这在可以多次运行的web服务中使用(甚至在同一时间)。
我面临的问题是,我突然有一个文件有重复的内容(因此原始内容是文件内的2倍)。
因为我不能重现的问题,我想知道是否有一个可能的星座(在多线程),尽管使用文件。创建对底层方法的另一个调用可能导致附加(而不是覆盖)内容的流?
编辑:正如被问到的那样,我正试图解释更多关于多重调用是如何可能的。
第三方工具创建重要文件(.xml)并调用我的webservice将它们传输到服务器上。如果由于任何原因传输失败,第三方工具将再次尝试传输它们。由于我在日志中看到几分钟内多次转移尝试,我担心(尽管我无法证明它是错的还是真的)。第一个调用花费的时间太长,当第一个调用还在进行时,第二个调用就来了。因此,它们彼此重叠(遗憾的是,我无法找到任何证据或与我可用的日志相比,因此我将采用最坏的情况,它们确实重叠,因此可能发生的竞争条件导致这个问题)。将sw.Seek(0, SeekOrigin.End);
放在调用Write
-方法之前。这将把光标移动到流的末尾。
但是你的问题并不是因为你在应该"追加"的地方"截断"了。你需要把上面的代码设计成线程安全的。实现这一点的最简单方法是引入一个锁句柄:
private readonly object _lock = new object()
public void SaveToFile(string fileName, byte[] data)
{
lock(_lock)
{
using(FileStream sw = FileStream.Create(fileName))
{
sw.Write(data, 0, data.Length);
}
}
}
锁块确保使用相同句柄(_lock
)的代码永远不会在同一时间执行。
提示:因为你是在处理流(通过使用using-block),所以你不需要冲洗它;-)