0

首先是底线...
如果您在包含 IO.File.Exist(FileTest) 的 Novell 客户端 Win7 上使用循环寻找 FileTest 消失意味着是时候继续前进,从另一个客户端删除 FileTest,然后您尝试要使用 FileTest 代表的名称,您将收到网络错误。我认为它与Novell Client Win7有关的原因是如果共享是Windows共享,我看不出问题。此外,当我们的客户是 XP SP3(不确定 Novell 版本)时,我们没有看到这一点。如评论中所述,我在 SAMBA 共享上尝试过此操作,但没有发现问题。


接下来是细节....
重现它很简单。

Module Module1
    Sub Main()
        Dim FileTest As String = "\\corp01\vol1\bbs\test.flg" 'corp01 is a Novell share'
        IO.File.WriteAllText(FileTest, "")
        Do While IO.File.Exists(FileTest)
            System.Threading.Thread.Sleep(100)
        Loop
    End Sub
End Module

然后从另一个客户端删除 test.flg 并且程序按预期结束。尝试再次运行它,当它尝试在 WriteAllText 中创建它时,您将收到网络错误。谁或如何创建文件似乎并不重要。我试图删除 WriteAllText 并从另一个客户端创建它,然后启动程序,从另一个客户端删除它,但在尝试引用名称时仍然出现网络错误。


我猜 ....
我认为该名称以某种方式被缓存。修复它的唯一方法是从 Windows 注销。另一个原因,如果 WriteFileText 抛出错误并且我尝试了另一种创建它的方式,仍然有错误。例如,在资源管理器中,我在共享上创建了一个文本文件,工作正常。然后尝试将创建的文件重命名为我的标志名称,网络错误。除了我用作标志文件的名称外,我可以将其重命名为任何其他文件名。

4

1 回答 1

0

目前,这是我能找到的最佳解决方案。基本上我尝试了windows API,它没有问题。我用所有三个共享(windows、Novell、SAMBA)测试了它,它似乎工作。这是作为仅供参考的代码。神奇之处在于 BRFileExist 类。结束时可能需要进行某种尝试/捕获/最终。我要试一试,这是首先在生产中的。

Class BRFileExist
    ' #VBIDEUtils#**************************************************
    ' * Programmer Name  : Waty Thierry
    ' * Web Site         : www.geocities.com/ResearchTriangle/6311/
    ' * E-Mail           : waty.thierry@usa.net
    ' * Date             : 28/06/99
    ' * Time             : 12:24
    ' **************************************************************
    ' * Comments         : API FileExist
    ' *
    ' *
    ' ****************************************************************'

    Private Const INVALID_HANDLE_VALUE = -1

    Private Structure FILETIME
        Dim dwLowDateTime As Long
        Dim dwHighDateTime As Long
    End Structure

    Private Structure WIN32_FIND_DATA
        Dim dwFileAttributes As Long
        Dim ftCreationTime As FILETIME
        Dim ftLastAccessTime As FILETIME
        Dim ftLastWriteTime As FILETIME
        Dim nFileSizeHigh As Long
        Dim nFileSizeLow As Long
        Dim dwReserved0 As Long
        Dim dwReserved1 As Long
        Dim cFileName As String
        Dim cAlternate As String
    End Structure

    Private Declare Function FindFirstFile Lib "kernel32" _
       Alias "FindFirstFileA" _
       (ByVal lpFileName As String, _
       ByVal lpFindFileData As WIN32_FIND_DATA) As Long

    Private Declare Function FindClose Lib "kernel32" _
       (ByVal hFindFile As Long) As Long
    Public Shared Function FileExist(ByVal pPath As String) As Boolean
        Dim WFD As New WIN32_FIND_DATA
        Dim hFile As Long = FindFirstFile(pPath, WFD)
        Dim retFileExist As Boolean = (hFile <> INVALID_HANDLE_VALUE)
        FindClose(hFile)
        Return retFileExist
    End Function
End Class
于 2014-10-29T14:36:06.433 回答