尽管使用File.Create,是否可以附加到文件?

时间:2016-08-10 10:14:49

标签: c# file io

我目前正在努力了解我所面临的问题。我有以下代码:

using (FileStream sw = File.Create(mypath))
{
    sw.Write(source, 0, bytesRead);
    sw.Flush();
}

这用于可以多次运行的Web服务(即使在同一时间)。

我面临的问题是我突然有一个文件有重复的内容(因此原始内容在文件中是2倍)。

由于我无法重现该问题,我想知道是否存在可能的星座(在多线程中),尽管使用File.Create来创建流,来自另一个对底层方法的调用的内容可能导致附加(而不是被覆盖的)内容?

编辑: 正如有人问的那样,我试图解释一下如何进行多次调用。

第三方工具创建重要文件(.xml)并调用我的webservice将它们传输到服务器上。如果转移因任何原因失败,第三方工具会再次尝试转移它们。因为我看到日志中的多次传输尝试在几分钟之内就会出现一个恐惧(我不能证明它是错误的还是真的,尽管记录最多)我的第一个呼叫需要太长时间而第二个呼叫来了当第一个还在继续时。因此,它们彼此重叠(遗憾的是,我找不到任何证明或与之相比,我可以使用的日志,因此我将在最糟糕的情况下,他们重叠,因此可能出现赛车条件导致这种情况问题)。

1 个答案:

答案 0 :(得分:0)

在致电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)的代码永远不会同时执行。

Pro tipp:由于您正在处理流(使用使用块),因此您不一定需要刷新它; - )