我一直在寻找各种解决方案,允许从以下错误中发生覆盖
{"进程无法访问该文件 ' C:\途径\ FILENAME.TXT'因为它正在 由另一个进程使用。"}
我已经尝试过,flushing
,closing
,GC.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"文件,然后它询问"如果我想替换这个文件"点击“是”后,它会崩溃并抛出无法访问错误的内容。
有人可以解释我如何访问和覆盖同一目的地的文件吗?
答案 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:文件系统中总有一些竞争条件的可能性,但我认为你不应该真的担心它 - 处理它只会让你的代码变得更复杂一无所获。