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

VB6,文件不';不存在,我如何优雅地处理?,vb6,file-io,Vb6,File Io,我正在测试一个应用程序,该应用程序检查网络中是否存在文件。在我的测试中,我故意拔掉网络插头,这样文件就找不到了。问题是这会导致我的应用程序在至少15秒钟内没有响应。我在VB6中使用了FileExists()和GetAttr()函数。有人知道如何解决这个问题吗?(不,我不能停止使用VB6) 谢谢, Charlie我不确定您能否更优雅地处理此问题-如果网络出现问题,可能需要一段时间才能超时,以表明问题严重到无法正常工作 如果VB6支持线程(我真的不记得了),您可以将文件旋转到后台线程中打开,并让UI

我正在测试一个应用程序,该应用程序检查网络中是否存在文件。在我的测试中,我故意拔掉网络插头,这样文件就找不到了。问题是这会导致我的应用程序在至少15秒钟内没有响应。我在VB6中使用了FileExists()和GetAttr()函数。有人知道如何解决这个问题吗?(不,我不能停止使用VB6)

谢谢,
Charlie

我不确定您能否更优雅地处理此问题-如果网络出现问题,可能需要一段时间才能超时,以表明问题严重到无法正常工作


如果VB6支持线程(我真的不记得了),您可以将文件旋转到后台线程中打开,并让UI允许用户取消它(或执行其他操作,如果有意义的话),但这会带来相当多的额外复杂性。

VB本质上是单线程的,但您可以将工作转移到COM组件,以执行异步文件检查,并在完成时标记事件。这样,UI线程至少保持响应。问题是-这都是理论,我不知道这样的组件

但是等等!谷歌刚刚发现了这个:。也许有帮助吗


此外,他们在CodeProject上也有类似的功能:

VB6有一些联网功能,可以测试网络是否已连接。您应该能够在“引用”下添加“NetCon 1.0类型库”。这为您添加了NETCONLib。一旦实现,您应该能够首先测试网络连接,然后测试FileExists和GetAttr


让我知道这是否有帮助

我同意威尔的看法。使用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相同的延迟问题。请记住这一点。

不幸的是,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站点有更多关于

的讨论,也可以使用它

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")

此代码仅用于检查连接(可能对您有帮助),以解决您的一个问题:

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

在超时开始之前,objFSO.FileExists不会返回,他首先要避免超时。