Novell Win 7客户端上的IO.File.Exists(“”)可能导致“网络错误”

时间:2014-10-29 12:40:02

标签: .net novell

首先是底线...
如果你在包含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抛出错误并尝试不同的创建方式,仍然有错误。例如在资源管理器中我在共享上创建了一个文本文件,工作正常。然后尝试将创建的文件重命名为我的标志名称,网络错误。我可以将它重命名为任何其他文件名,除了我用作标志文件的名称。

1 个答案:

答案 0 :(得分:0)

目前这是我能找到的最佳解决方案。基本上我尝试了Windows API,它没有问题。我用所有三个共享(windows,Novell,SAMBA)测试它,它似乎工作。这是代码作为FYI。神奇的是在BRFileExist类中。关闭时可能需要尝试/ catch / finally。我将尝试它首先在生产中。

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