Vb.net .net:这个文件正在使用吗?
我在这个网站上看到了这个问题的多个版本,但似乎没有一个能解决我的精确性问题,所以这里是: 我正在尝试使用Vb.net .net:这个文件正在使用吗?,vb.net,io,file-copying,Vb.net,Io,File Copying,我在这个网站上看到了这个问题的多个版本,但似乎没有一个能解决我的精确性问题,所以这里是: 我正在尝试使用System.copy复制文件。应该覆盖目标(如果存在)。我已经使用一行代码大约一个月了,没有出现任何问题: IO.File.Copy(SourceFile, DestFile, True) 但问题是大约一周前开始的,当时我开始进行更高级的检查。部分锁定的文件复制失败,目标被删除。另一方面,锁定的文件工作正常:它们只会触发一个正在使用的文件异常 因此,在启动副本之前,我添加了这一行: Usi
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)在添加的代码中触发错误,而它们以前复制得很好(您可以在资源管理器中复制它们)
我的问题基本上是:我如何告诉系统:如果可能,将源代码
复制到目标代码
;如果没有,请不要中断目的地
?
感谢您的帮助,这件事快把我逼疯了。您需要将代码包装在try/catch块中 在c#use中,可以用IOException替换异常类型
FileStream fileStream = null;
try
{
fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Write);
}
catch (UnauthorizedAccessException e)
{
}
finally
{
if (fileStream != null)
fileStream.Close ();
}
使用两步过程——复制到临时文件,然后重命名为目标文件。这样,如果复制失败,目标文件将不会被覆盖
更好的是,你需要四个步骤。复制到临时,重命名dest为other temp,重命名temp为dest,删除other 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)
我怀疑这是因为您正在使用IO.FileShare.None 这意味着任何其他线程都无法共享该文件。由于文件已经打开,即使副本可以工作,也会失败,因为副本通常以读取共享模式打开文件
您可以改为尝试IO.FileShare.Read。您应该知道,该文件可以在检查后使用,但就在复制之前。当然,但这是一个我无法避免的极端情况。我正在考虑解决这个非常具体的问题,但现在我陷入了两难境地,当源代码部分锁定时,第一行代码会删除目标(例如outlook pst文件),而添加第二行将强制执行强检查。我之所以提到它,是因为我不知道您正在复制什么类型的文件。在很多情况下,这并不重要,但有时确实重要,所以你在做决定时应该意识到这一点;但我仍在寻找解决我的一个非常具体的问题的方法:我如何告诉系统:如果可以,复制文件,但如果无法读取源代码,请不要更改目标?为了更清楚,我对问题进行了编辑。这根本没有解决问题;提出一个例外是好的;唯一的问题是您建议的代码太敏感。如果我像你提到的那样替换异常类型,我将获得成功复制的文件的
IOException
s。这不会影响远程位置的性能吗?在网络驱动器上。我想会的,这就是为什么我没有这样做…事实上,我可以用它作为一个后备:如果第一次测试失败,使用这种方法。我仍然希望看到一个更漂亮的解决方案,尽管=)另一个问题是大文件:在某个点上,您使用的空间是所需空间的两倍。这不会对性能产生任何明显影响。仍然只有一个文件。复制调用。之后,所有操作都是移动
或删除
,这两种操作都非常快。不,成功复制文件也会出现同样的错误。