Vb.net File.Copy FileNotFoundException在';这从来都不是真的
代码非常简单Vb.net File.Copy FileNotFoundException在';这从来都不是真的,vb.net,Vb.net,代码非常简单 If File.Exists(strFileMovingTo) Then File.Delete(strFileMovingTo) If File.Exists(strFileMovingTo) Then Call SendEmail(Globals.EmailInternetTeam, "dev-sql@fad.co.uk", "Display Jpg Problem", "The file " & strFileMovingTo & " cannot b
If File.Exists(strFileMovingTo) Then File.Delete(strFileMovingTo)
If File.Exists(strFileMovingTo) Then
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@fad.co.uk", "Display Jpg Problem", "The file " & strFileMovingTo & " cannot be removed by the file mover(to allow a new file to be moved over)")
Return False
Else
If File.Exists(strFileMovingFrom) Then
File.Copy(strFileMovingFrom, strFileMovingTo, True)
If File.Exists(strFileMovingTo) = False Then
''tried to copy file over but must have failed ... send email
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@friday-ad.co.uk", "Display Jpg Problem", "The file cannot be moved by the file mover from " & strFileMovingFrom & " to " & strFileMovingTo & ". Please have a look at why.")
Return False
Else
Return True
End If
End If
Return False
''make sure this file exists on fad dev
End If
但是,在File.Copy
过程中会引发FileNotFoundException
异常,即使它包装在中,如果File.Exists。。。如果要检查其存在,请结束
最棒的是,如果你通过调试器运行它,它几乎总是工作的,当作为应用程序发布时,它几乎永远不会工作
令人遗憾的是,该文件始终存在
有人知道发生了什么吗?它在调试中工作的事实告诉我这是一个计时问题。您等待删除或其他文件系统更改的时间不够长
在进行文件系统更改后,在一到两秒钟内构建
更新:
如何:创建一个共享的文件移动字典,并使用FileSystemWatcher执行复制操作
If File.Exists(strFileMovingTo) Then File.Delete(strFileMovingTo)
Thread.Sleep(1000) --Add wait
If File.Exists(strFileMovingTo) Then
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@fad.co.uk", "Display Jpg Problem", "The file " & strFileMovingTo & " cannot be removed by the file mover(to allow a new file to be moved over)")
Return False
Else
If File.Exists(strFileMovingFrom) Then
File.Copy(strFileMovingFrom, strFileMovingTo, True)
Thread.Sleep(1000) --Add wait
If File.Exists(strFileMovingTo) = False Then
'tried to copy file over but must have failed ... send email
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@friday-ad.co.uk", "Display Jpg Problem", "The file cannot be moved by the file mover from " & strFileMovingFrom & " to " & strFileMovingTo & ". Please have a look at why.")
Return False
Else
Return True
End If
End If
Return False
'make sure this file exists on fad dev
End If
它在debug中工作的事实告诉我这是一个时间问题。您等待删除或其他文件系统更改的时间不够长
在进行文件系统更改后,在一到两秒钟内构建
更新:
如何:创建一个共享的文件移动字典,并使用FileSystemWatcher执行复制操作
If File.Exists(strFileMovingTo) Then File.Delete(strFileMovingTo)
Thread.Sleep(1000) --Add wait
If File.Exists(strFileMovingTo) Then
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@fad.co.uk", "Display Jpg Problem", "The file " & strFileMovingTo & " cannot be removed by the file mover(to allow a new file to be moved over)")
Return False
Else
If File.Exists(strFileMovingFrom) Then
File.Copy(strFileMovingFrom, strFileMovingTo, True)
Thread.Sleep(1000) --Add wait
If File.Exists(strFileMovingTo) = False Then
'tried to copy file over but must have failed ... send email
Call SendEmail(Globals.EmailInternetTeam, "dev-sql@friday-ad.co.uk", "Display Jpg Problem", "The file cannot be moved by the file mover from " & strFileMovingFrom & " to " & strFileMovingTo & ". Please have a look at why.")
Return False
Else
Return True
End If
End If
Return False
'make sure this file exists on fad dev
End If
删除文件可能有其他原因,对file.Exists和file.Copy的调用之间存在竞争条件。删除文件可能有其他原因,对file.Exists和file.Copy的调用之间存在竞争条件。我同意这看起来像是一个时间问题。此外,如果由于任何原因无法删除文件,则通常file.Delete
会引发异常。也许你应该抓住这一点,重新设计你的逻辑。我同意这看起来像是一个时间问题。此外,如果由于任何原因无法删除文件,则通常file.Delete
会引发异常。也许你应该抓住这一点,重新设计你的逻辑。有很多竞争条件,你不应该盲目地依赖File.Exists来进行其他文件操作。任何人都可以在两个函数调用之间删除或添加同名文件
If File.Exists(strFileMovingFrom) Then
// AT THIS TIME, another thread or another process might run
// the equivalent to **File.Delete(strFileMovingFrom)**
File.Copy(strFileMovingFrom, strFileMovingTo, True) //Can throw!
有很多竞争条件,你不应该盲目地依赖于File.Exists进行其他文件操作。任何人都可以在两个函数调用之间删除或添加同名文件
If File.Exists(strFileMovingFrom) Then
// AT THIS TIME, another thread or another process might run
// the equivalent to **File.Delete(strFileMovingFrom)**
File.Copy(strFileMovingFrom, strFileMovingTo, True) //Can throw!
在使用Windows API的某些文件函数时(对于.NET也是如此),应始终了解文件系统函数的异步性质。异步,意味着从您调用影响文件系统的API到下一次成功调用与文件或目录相关的同一API之间存在一段非零、不可预测、无保证的时间
在非事务性API中,常见的错误是调用“创建文件”,然后立即尝试“findFirst”并失败。只需将文件系统视为具有不可预测延迟的消息传递系统,并开发一种具有重复轮询、休眠和超时或事件通知和回调的“协议”
然而,自从Vista推出以来,当应用程序可以使用所谓的“事务性”文件API时,就有了一套不同的保证和期望 在使用Windows API的某些文件函数时(对于.NET也是如此),应始终注意文件系统函数的异步性质。异步,意味着从您调用影响文件系统的API到下一次成功调用与文件或目录相关的同一API之间存在一段非零、不可预测、无保证的时间
在非事务性API中,常见的错误是调用“创建文件”,然后立即尝试“findFirst”并失败。只需将文件系统视为具有不可预测延迟的消息传递系统,并开发一种具有重复轮询、休眠和超时或事件通知和回调的“协议”
然而,自从Vista推出以来,当应用程序可以使用所谓的“事务性”文件API时,就有了一套不同的保证和期望我确实考虑过这个问题,但是这个应用程序一分钟只运行一次,而且文件经常在那里运行几秒钟,失败的ONCES有时在传输之前2到3分钟就在那里。我想知道File.Exists是否确实“锁定”了该文件。我认为是删除导致了您的问题。代码运行速度太快,以至于在Delete命令完成之前尝试复制文件。我将添加sleeps,但file.Delete很少被调用,因为这些文件只上载过一次。通常我会在睡眠中加上:)等待一秒钟几乎永远不是答案,如果我们真的需要等待,你选择的任何时间都不会每次都是正确的。如果这段代码有用,它有时仍然会失败,无论是在重载情况下,还是在要求移动比正常文件更大的文件时,或者当磁盘更零碎时。等待不是问题。。。这是因为我使用UNC路径,源是网络路径,目的地是网络路径?我确实考虑过这个问题,但是这个应用程序只运行一分钟,而且文件经常在那里几秒钟,失败的ONCES有时在传输之前2到3分钟就在那里。我想知道File.Exists是否确实“锁定”了该文件。我认为是删除导致了您的问题。代码运行速度太快,以至于在Delete命令完成之前尝试复制文件。我将添加sleeps,但file.Delete很少被调用,因为这些文件只上载过一次。通常我会在睡眠中加上:)等待一秒钟几乎永远不是答案,如果我们真的需要等待,你选择的任何时间都不会每次都是正确的。如果这段代码有帮助,它有时仍然会失败,要么是在重载下,要么是在要求移动比正常文件大的文件时,要么是在