1

我在这个网站上看到了这个问题的多个版本,但似乎没有一个能解决我的问题,所以这里是:

我正在尝试使用System.Copy. 目的地(如果存在)应被覆盖。我已经使用一行代码大约一个月了,没有问题:

IO.File.Copy(SourceFile, DestFile, True)

但问题开始于大约一周前,当时我开始进行更高级的检查。部分锁定的文件无法复制,并且目标被删除。另一方面,锁定的文件可以正常工作:它们只是触发文件正在使用异常。

所以我在启动副本之前添加了这一行:

Using TestForAccess As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)  : End Using

如果文件正在使用中,这应该会引发错误。但它是敏感的。某些文件(例如 Thunderbird 的 abook.mab)会在此添加的代码中触发错误,而之前它们复制得很好(您可以在资源管理器中复制它们)。

我的问题基本上是:我如何告诉系统:尽可能复制source到;destination如果没有,不要打破destination

感谢您的帮助,这件事让我发疯了。

4

3 回答 3

1

使用两步过程 - 复制到临时文件,然后重命名为目标。这样,如果复制失败,目标文件将不会被覆盖。

更好的是,你四个步骤。复制到 temp,将 dest 重命名为其他 temp,将 temp 重命名为 dest,删除其他 temp。

我的 VB 生锈了,但是是这样的:

Dim DestTemp As String = DestFile + ".temp"
Dim DestBack As String = DestFile + ".bak"
File.Copy(SourceFile, DestTemp, True)
File.Move(DestFile, DestBack)
File.Move(DestTemp, DestFile)
File.Delete(DestBack)
于 2011-03-30T16:41:37.983 回答
0

我怀疑这是因为您使用的是 IO.FileShare.None。

这意味着该文件不能被任何其他线程共享。由于文件已经打开,即使副本可以工作也会失败,因为副本通常以 READ 共享模式打开文件

您可以尝试 IO.FileShare.Read 代替。

于 2011-03-30T17:43:49.380 回答
-1

您需要将代码包装在 try/catch 块中。

在 c# 中使用 - 您可以用 IOException 替换异常类型

FileStream fileStream = null;  
try 
{     
fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Write); 
} 
catch (UnauthorizedAccessException e) 
{
} 
finally 
{     
if (fileStream != null)         
fileStream.Close (); 
} 
于 2011-03-30T16:22:23.517 回答