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 からログオフすることです。もう 1 つの理由は、WriteFileText がエラーをスローしていて、それを別の方法で作成しようとすると、まだエラーが発生することです。たとえば、エクスプローラーで共有にテキスト ファイルを作成すると、問題なく動作します。次に、作成したファイルの名前を私のフラグ名、ネットワーク エラーに変更してみてください。フラグ ファイルとして使用する名前以外の任意のファイル名に名前を変更できます。

4

1 に答える 1

0

今のところ、これが私が見つけた最善の解決策です。基本的に、Windows API を試しましたが、問題はありませんでした。3 つの共有すべて (Windows、Novell、SAMBA) でテストしたところ、動作するように見えました。参考までにコードを以下に示します。魔法は BRFileExist クラスにあります。クローズするには、ある種の try/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
于 2014-10-29T14:36:06.433 に答える