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