2008-10-14 16 views
5

Estoy probando una aplicación que verifica si existe un archivo en una red. En mi prueba, estoy jalando el enchufe de la red para que no se encuentre el archivo. El problema es que hace que mi aplicación deje de responder durante al menos 15 segundos. He utilizado las funciones FileExists() y GetAttr() en VB6. ¿Alguien sabe cómo arreglar este problema? (No, no puedo dejar de usar VB6)VB6, archivo no existe, ¿Cómo manejo elegantemente?

Gracias, Charlie

Respuesta

0

No estoy seguro de que puede manejar esta cantidad con más gracia - si la red está teniendo problemas que puede tomar un tiempo para que los tiempos de espera a indican que el problema es lo suficientemente grave como para que las cosas no funcionen.

Si VB6 admite el enhebrado (honestamente no recuerdo) podría girar el archivo abierto en una secuencia de fondo, y hacer que la UI le permita al usuario cancelarlo (o realizar otras operaciones si eso tiene sentido), pero eso introduce una cantidad bastante significativa de complejidad adicional.

0

VB es intrínsecamente de un solo subproceso, pero puede desviar el trabajo a un componente COM para realizar una comprobación de archivo asíncrono y marcar un evento cuando finaliza. De esta forma, el hilo de la interfaz de usuario permanece al menos en respuesta. El problema es que esto es teoría, no conozco ese componente.

¡Pero espera! Google acaba de presentar esto: Visual Basic 6 Asynchronous File I/O Using the .NET Framework. ¿Eso ayuda, tal vez?

Además, tienen algo similar a lo largo CodeProject: Asynchronous processing - Basics and a walkthrough with VB6/ VB.NET

0

VB6 tiene algunas funciones de red que pueden probar para ver si está conectado a la red. Debería poder agregar en 'Referencias' la 'Biblioteca de tipos de NetCon 1.0'. Esto agrega para usted NETCONLib. Una vez implementado, primero debería probar la conectividad de la red y luego probar FileExists y GetAttr.

¡Avíseme si esto es útil!

-1

Estoy de acuerdo con Will. Algo así es fácil de manejar con 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

objFSO.FileExists ganaron' volverá hasta que empiecen los tiempos muertos que quiere evitar en primer lugar. – Tomalak

-1

El acceso a los archivos a través de una red puede causar estos cuelgues.

Ha pasado un tiempo, pero recuerdo que el multi-threading en VB6 es relativamente difícil de implementar. Una solución rápida sería tener un .exe pequeño (quizás también codificado en VB) que pueda manejar esto. Puede usar DDE para la comunicación entre aplicaciones o el canal siempre fácil pero complicado basado en archivos, con lo cual me refiero a un archivo que ambas aplicaciones leerán/escribirán mutuamente para manejar la comunicación entre aplicaciones. Por supuesto, el uso de las tuberías basadas en archivos, dependiendo de los detalles de este escenario, puede simplemente exagerar el retraso de E/S de archivos.

Si hay un grado razonable con el que puede predecir de dónde seleccionará el usuario los archivos, puede considerar almacenar en caché preventivamente un listado de directorio y leerlo en lugar del archivo directamente, suponiendo que no se espera que el contenido del directorio cambie. frecuentemente. Nota: obtener una lista de directorios a través de una red causará los mismos problemas de retardo que las E/S de archivos individuales en una red. Mantenlo en mente.

6

Desafortunadamente, VB no lo hace fácil, pero afortunadamente la API de Win32 sí lo hace, y es bastante simple llamar a las funciones de Win32 desde VB.

Para la red LAN/WAN, puede utilizar una combinación de las siguientes API Win32 llama para decirle que si existe la conexión remota sin tener que lidiar con una red de tiempo de espera:

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 

Por Internet , puede utilizar la API de Win32 llamada:

sitio
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 

esta VB tiene más discusión sobre path oriented functions you can call in the Win32 API through VB.

1

uso esto también

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

este código sólo se utiliza para comprobar la conexión (tal vez puede ayudarle a) para una de sus problemas:

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 

en su caso:

If checknet = False Then 

... 

else 

... 

end if 
Cuestiones relacionadas