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时,就有了一套不同的保证和期望