我正在测试一个应用程序,它检查网络中是否存在文件。在我的测试中,我故意拉网络插件,因此找不到文件。问题是这导致我的应用程序无响应至少15秒。我在VB6中使用了FileExists()和GetAttr()函数。有谁知道如何解决这个问题? (不,我不能停止使用VB6)
谢谢, 查理
答案 0 :(得分:6)
不幸的是,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
对于Internet,您可以使用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网站对path oriented functions you can call in the Win32 API through VB.
进行了更多讨论答案 1 :(得分:1)
也可以使用
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")
答案 2 :(得分:0)
我不确定你能否更优雅地处理这个问题 - 如果网络出现问题,可能需要一段时间才能显示问题严重到事情无法解决问题。
如果VB6支持线程(我老实说不记得)你可以将文件打开到后台线程,并让UI允许用户取消它(或者如果有意义的话执行其他操作),但是这会引入相当大的额外复杂性。
答案 3 :(得分:0)
VB本质上是单线程的,但您可以将工作转移到COM组件以执行异步文件检查,并在完成后标记事件。这样,UI线程至少保持响应。麻烦的是 - 这是所有的理论,我不知道这样的组件。
但是等等!谷歌刚出现这个问题:Visual Basic 6 Asynchronous File I/O Using the .NET Framework。那可能有帮助吗?
此外,他们在CodeProject上有类似的东西:Asynchronous processing - Basics and a walkthrough with VB6/ VB.NET
答案 4 :(得分:0)
VB6具有一些网络功能,可以测试网络是否已连接。您应该能够在'参考'下添加'NetCon 1.0类型库'。这为您增加了NETCONLib。一旦实现,您应该能够首先测试网络连接,然后测试FileExists和GetAttr。
请告诉我这是否有帮助!
答案 5 :(得分:0)
此代码仅用于检查连接(可能可以帮助您)解决您的一个问题:
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
答案 6 :(得分:-1)
我同意威尔。使用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
答案 7 :(得分:-1)
通过网络访问文件可能会导致这些挂起。
已经有一段时间了,但我记得VB6中的多线程实现起来相对比较痛苦。一个快速的解决方案是使用一个小的.exe(也许也用VB编写)来处理这个问题。您可以使用DDE进行应用程序间通信,或者使用基于文件的简单管道,我指的是两个应用程序将相互读/写以处理应用程序间通信的文件。当然,根据这种情况的细节,使用基于文件的管道可能只会夸大文件I / O延迟。
如果有合理的程度可以预测用户从哪里选择文件,您可以考虑抢先缓存目录列表并直接读取该文件而不是文件 - 假设目录内容不会经常更改。注意:通过网络获取目录列表将导致与网络上的单个文件I / O相同的延迟问题。记住这一点。