Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net .net:这个文件正在使用吗?_Vb.net_Io_File Copying - Fatal编程技术网

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。这不会影响远程位置的性能吗?在网络驱动器上。我想会的,这就是为什么我没有这样做…事实上,我可以用它作为一个后备:如果第一次测试失败,使用这种方法。我仍然希望看到一个更漂亮的解决方案,尽管=)另一个问题是大文件:在某个点上,您使用的空间是所需空间的两倍。这不会对性能产生任何明显影响。仍然只有一个
文件。复制
调用。之后,所有操作都是
移动
删除
,这两种操作都非常快。不,成功复制文件也会出现同样的错误。