VB6, файла не существует, как мне справиться с этим - PullRequest
5 голосов
/ 15 октября 2008

Я тестирую приложение, которое проверяет, существует ли файл в сети. В моем тестировании я целенаправленно вытягиваю сетевой штекер, чтобы файл не был найден. Проблема в том, что мое приложение перестает отвечать на запросы в течение как минимум 15 секунд. Я использовал обе функции FileExists () и GetAttr () в VB6. Кто-нибудь знает, как решить эту проблему? (Нет, я не могу перестать использовать VB6)

Спасибо, Charlie

Ответы [ 8 ]

6 голосов
/ 16 октября 2008

К сожалению, VB не делает это простым, но, к счастью, это делает API Win32, и довольно просто вызывать функции Win32 из VB.

Для 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 более подробно обсуждаются ориентированные на пути функции, которые вы можете вызывать в Win32 API через VB.

1 голос
/ 16 февраля 2011

используйте это тоже

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")
0 голосов
/ 08 октября 2013

этот код используется только для проверки соединения (возможно, может помочь вам) для одной из ваших проблем:

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
0 голосов
/ 16 октября 2008

Доступ к файлам по сети может вызвать эти зависания.

Это было давно, но я помню, что многопоточность в VB6 была довольно болезненной для реализации. Быстрое решение будет иметь небольшой .exe (возможно, также закодированный в VB), который может справиться с этим. Вы можете использовать DDE для взаимодействия между приложениями или очень простой, но неуклюжий канал на основе файлов, под которым я подразумеваю файл, который оба приложения будут взаимно читать / записывать для обработки взаимодействия между приложениями. Конечно, использование файловых каналов, в зависимости от деталей этого сценария, может просто преувеличивать задержку файлового ввода-вывода.

Если есть разумная степень, с которой вы можете предсказать, откуда пользователь будет выбирать файлы, вы можете предпочесть кэширование с упреждением и чтение этого каталога, а не непосредственно файла - при условии, что содержимое каталога не должно часто меняться , Примечание. Получение списка каталогов по сети вызовет те же проблемы с задержкой, что и при вводе-выводе отдельных файлов по сети. Имейте это в виду.

0 голосов
/ 15 октября 2008

Я согласен с Уиллом. Нечто подобное легко обрабатывать с помощью 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
0 голосов
/ 15 октября 2008

VB6 имеет некоторые сетевые функции, которые могут проверить, подключена ли сеть. Вы должны иметь возможность добавить в разделе «Ссылки» «Библиотека типов NetCon 1.0». Это добавляет для вас NETCONLib. После внедрения вы должны сначала проверить сетевое соединение, а затем проверить FileExists и GetAttr.

Дайте мне знать, если это поможет!

0 голосов
/ 15 октября 2008

VB по своей природе является однопоточным, но вы можете перенаправить работу на COM-компонент, чтобы выполнить асинхронную проверку файла и пометить событие, когда это будет сделано. Таким образом, поток пользовательского интерфейса остается как минимум отзывчивым. Проблема в том, что это все теория, я не знаю такого компонента.

Но подождите! Google только что обнаружил следующее: Асинхронный файловый ввод / вывод Visual Basic 6 с использованием .NET Framework . Может, это поможет?

Кроме того, они имеют нечто похожее в CodeProject: Асинхронная обработка - основы и пошаговое руководство с VB6 / VB.NET

0 голосов
/ 15 октября 2008

Я не уверен, что вы справитесь с этим гораздо более изящно - если в сети возникают проблемы, может потребоваться некоторое время, чтобы тайм-ауты указали, что проблема достаточно серьезна, чтобы что-то не работало.

Если VB6 поддерживает многопоточность (честно говоря, я не помню), вы могли бы открыть файл в фоновом потоке и иметь пользовательский интерфейс, позволяющий пользователю отменить его (или выполнить другие операции, если это имеет смысл), но это вводит довольно значительное количество дополнительной сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...