在File.Copy期间无法覆盖工作 - 无法访问错误

时间:2014-07-28 17:08:19

标签: c# file-io

我一直在寻找各种解决方案,允许从以下错误中发生覆盖

  

{"进程无法访问该文件   ' C:\途径\ FILENAME.TXT'因为它正在   由另一个进程使用。"}

我已经尝试过,flushingclosingGC.Collect()等等......但我似乎找不到通过此错误的方法。

我写了一个" temp"这样的文件

        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                foreach (var line in detailLines)
                {
                    sw.WriteLine(line);
                }
                sw.Flush();
                sw.Close();
            }
        }
        GC.Collect();

然后允许用户指定我在上面复制文件的目的地。

private void SaveFile()
{
    SaveFileDialog saveFile = new SaveFileDialog();
    saveFile.FileName = fileName;
    saveFile.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";            
    if (saveFile.ShowDialog() == DialogResult.OK)
    {
        System.IO.File.Copy(fileName, saveFile.FileName, true);
    }
}

我可以保存为新名称,但是如果我试图保存在同一条路径和名称上,那么" temp"文件,然后它询问"如果我想替换这个文件"点击“是”后,它会崩溃并抛出无法访问错误的内容。

有人可以解释我如何访问和覆盖同一目的地的文件吗?

1 个答案:

答案 0 :(得分:2)

尽管File.Copy方法说:

  

允许覆盖同名文件。

它实际上没有成功(看起来这个句子意味着其他东西):

try
{
    String filePath = @"C:\TEMP\test.txt";
    using (var fs = new StreamWriter(filePath))
    {
        fs.Write("data");
    }

    Console.WriteLine("File written");

    // Fails
    System.IO.File.Copy(filePath, filePath, true);

    Console.WriteLine("File overwritten by itself");

}
catch (Exception exc)
{
    Console.WriteLine(exc.Message);
}

所以,您应该只检查临时文件和目标文件是否相同并采取相应措施:

if (fileName != saveFile.FileName)
    System.IO.File.Copy(fileName, saveFile.FileName, true);

PS:文件系统中总有一些竞争条件的可能性,但我认为你不应该真的担心它 - 处理它只会让你的代码变得更复杂一无所获。