ファイルがネットワーク上に存在するかどうかをチェックするアプリケーションをテストしています。私のテストでは、ファイルが見つからないように意図的にネットワーク プラグを抜いています。問題は、これによりアプリが少なくとも 15 秒間応答しなくなることです。VB6 で FileExists() 関数と GetAttr() 関数の両方を使用しました。この問題を解決する方法を知っている人はいますか?(いいえ、VB6 を使うのをやめるわけにはいきません)
ありがとう、チャーリー
残念ながら、VB ではこれを簡単に行うことはできませんが、幸運なことに Win32 API ではそれが可能であり、VB 内から Win32 関数を呼び出すのは非常に簡単です。
LAN/WAN の場合、次の Win32 API 呼び出しの組み合わせを使用して、ネットワーク タイムアウトに対処することなく、リモート接続が存在するかどうかを確認できます。
Private Declare Function WNetGetConnection Lib "mpr.dll" Alias _
"WNetGetConnectionA" (ByVal lpszLocalName As String, _
ByVal lpszRemoteName As String, ByRef cbRemoteName As Long) As Long
Private Declare Function PathIsNetworkPath Lib "shlwapi.dll" Alias _
"PathIsNetworkPathA" (ByVal pszPath As String) As Long
Private Declare Function PathIsUNC Lib "shlwapi.dll" Alias "PathIsUNCA" _
(ByVal pszPath As String) As Long
インターネットの場合、Win32 API 呼び出しを使用できます。
Private Declare Function InternetGetConnectedState Lib "wininet.dll" _
(ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long
Const INTERNET_CONNECTION_MODEM = 1
Const INTERNET_CONNECTION_LAN = 2
Const INTERNET_CONNECTION_PROXY = 4
Const INTERNET_CONNECTION_MODEM_BUSY = 8
この VB サイトでは、VB を介して Win32 API で呼び出すことができるパス指向の関数について詳しく説明しています。
これも使って
Dim FlSize as long
flsize=filelen("yourfilepath")
if err.number=53 then msgbox("file not found")
if err.number=78 then msgbox("Path Does no Exist")
VB は本質的にシングル スレッドですが、作業を COM コンポーネントに流用して、非同期ファイル チェックを実行し、完了時にイベントにフラグを立てることができます。このようにして、UI スレッドは少なくとも応答性を保ちます。問題は-これはすべて理論であり、そのようなコンポーネントは知りません。
ちょっと待って!Google は、Visual Basic 6 Asynchronous File I/O Using the .NET Framework を見つけました。それは役に立ちますか?
また、CodeProject: Asynchronous processing - Basics and a walkthrough with VB6/ VB.NETにも似たようなものがあります。
このコードは、問題の1つについて接続を確認するためにのみ使用されます(おそらくあなたを助けることができます):
Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef dwFlags As Long, ByVal dwReserved As Long) As Long
Private Const CONNECT_LAN As Long = &H2
Private Const CONNECT_MODEM As Long = &H1
Private Const CONNECT_PROXY As Long = &H4
Private Const CONNECT_OFFLINE As Long = &H20
Private Const CONNECT_CONFIGURED As Long = &H40
Public Function checknet() As Boolean
Dim Msg As String
If IsWebConnected(Msg) Then
checknet = True
Else
If (Msg = "LAN") Or (Msg = "Offline") Or (Msg = "Configured") Or (Msg = "Proxy") Then
checknet = False
End If
End If
End Function
Private Function IsWebConnected(Optional ByRef ConnType As String) As Boolean
Dim dwFlags As Long
Dim WebTest As Boolean
ConnType = ""
WebTest = InternetGetConnectedState(dwFlags, 0&)
Select Case WebTest
Case dwFlags And CONNECT_LAN: ConnType = "LAN"
Case dwFlags And CONNECT_MODEM: ConnType = "Modem"
Case dwFlags And CONNECT_PROXY: ConnType = "Proxy"
Case dwFlags And CONNECT_OFFLINE: ConnType = "Offline"
Case dwFlags And CONNECT_CONFIGURED: ConnType = "Configured"
Case dwFlags And CONNECT_RAS: ConnType = "Remote"
End Select
IsWebConnected = WebTest
End Function
あなたのイベントで:
If checknet = False Then
...
else
...
end if
VB6 には、ネットワークが接続されているかどうかをテストできるネットワーク機能がいくつかあります。「参照」の下に「NetCon 1.0 Type Library」を追加できるはずです。これにより、NETCONLib が追加されます。実装したら、最初にネットワーク接続をテストし、次に FileExists と GetAttr をテストできるはずです。
これが役立つかどうか教えてください!
これをもっとうまく処理できるかどうかはわかりません.ネットワークに問題がある場合、問題が深刻で機能していないことをタイムアウトが示すまでに時間がかかることがあります.
VB6 がスレッド化をサポートしている場合 (私は正直思い出せません)、ファイルを開いてバックグラウンド スレッドにスピンし、UI でユーザーがそれをキャンセルできるようにする (または、それが理にかなっている場合は他の操作を実行する) ことができますが、それはかなり重要な問題を引き起こします。追加の複雑さの量。
私はウィルに同意します。このようなものは、Script.FileSystemObjectで簡単に処理できます。
Dim objFSO As New FileSystemObject
If objFSO.FileExists("C:\path\to\your_file.txt") Then
' Do some stuff with the file
Else
' File isn't here...be nice to the user.
EndIf
ネットワーク経由でファイルにアクセスすると、これらのハングが発生する可能性があります。
しばらく経ちましたが、VB6 でのマルチスレッドの実装は比較的苦労したことを覚えています。簡単な解決策は、これを処理できる小さな .exe (おそらく VB でコーディングされているもの) を用意することです。アプリ間通信に DDE を使用することも、非常に簡単ですが扱いにくいファイルベースのパイプを使用することもできます。これは、アプリ間通信を処理するために両方のアプリが相互に読み取り/書き込みを行うファイルを意味します。もちろん、このシナリオの詳細によっては、ファイルベースのパイプを使用すると、ファイル I/O ラグが単純に誇張される可能性があります。
ユーザーがどこからファイルを選択するかをある程度予測できる場合は、ディレクトリの内容が頻繁に変更されることが想定されていないと仮定して、ファイルを直接ではなく、先制的にディレクトリ リストをキャッシュしてそれを読み取ることを検討できます。注: ネットワーク経由でディレクトリ リストを取得すると、ネットワーク経由の個々のファイル I/O と同じ遅延の問題が発生します。心に留めておきます。