VB6,文件不存在,我如何处理优雅?

时间:2008-10-14 20:25:30

标签: vb6 file-io

我正在测试一个应用程序,它检查网络中是否存在文件。在我的测试中,我故意拉网络插件,因此找不到文件。问题是这导致我的应用程序无响应至少15秒。我在VB6中使用了FileExists()和GetAttr()函数。有谁知道如何解决这个问题? (不,我不能停止使用VB6)

谢谢,    查理

8 个答案:

答案 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相同的延迟问题。记住这一点。