elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  isFileBusy ? checkear si el archivo está ocupado por otra aplicación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: isFileBusy ? checkear si el archivo está ocupado por otra aplicación  (Leído 10,493 veces)
extreme69

Desconectado Desconectado

Mensajes: 178


Be BlackHat but don't forget your principles.


Ver Perfil
isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« en: 23 Junio 2011, 02:20 am »

Hola, sigo con mi proyecto y tengo más y más inconvenientes a cada rato.

Tengo que detectar si un archivo está en uso, y detallo...

El archivo es generado lentamente por otra aplicacion, este archivo puede llegar a pesar 10gb y tengo que detectar lo antes posible sin generar conflictos cuando terminó de generarse.

A lo bestia, se me ocurrió usar un timer y chequear el peso del archivo cada X segundos, si no cambia de tamaño en X tiempo entonces sigue con las tareas, pero esto no me resulta práctico, me consume muchos recursos y no me convence para nada la idea de usar un timer durante 10 o más minutos.

Googleando alguna alternativa, me encontré con un código en bigresource q postió un tal "plenderj".

Código:
Private Function isFileLocked(ByVal strFilePath As String) As Boolean
    On Error GoTo errHandle
    isFileLocked = False
    Open strFilePath For Binary Access Read Write Lock Read Write As #1
        
    Close #1
    Exit Function
errHandle:
    isFileLocked = True
msgbox "Está siendo usado por otra aplicación"
End Function
Le agrego un msgbox para ver q me devuelve, se lo agrego debajo de "isFileLocked = True" de manera que si el archivo está ocupado me lo diga, pero me dice que está ocupado incluso cuando no lo está :S

Sugerencias?


« Última modificación: 23 Junio 2011, 02:25 am por extreme69 » En línea

Edu


Desconectado Desconectado

Mensajes: 1.082


Ex XXX-ZERO-XXX


Ver Perfil
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #1 en: 23 Junio 2011, 04:07 am »

Y si miras los procesos?


En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #2 en: 23 Junio 2011, 04:10 am »

Código
  1. Private Declare Function CreateFile Lib "kernel32" Alias _
  2.    "CreateFileA" (ByVal lpFileName As String, _
  3.    ByVal dwDesiredAccess As Long, _
  4.    ByVal dwShareMode As Long, _
  5.    ByVal lpSecurityAttributes As Long, _
  6.    ByVal dwCreationDisposition As Long, _
  7.    ByVal dwFlagsAndAttributes As Long, _
  8.    ByVal hTemplateFile As Long) As Long
  9.  
  10. Private Declare Function CloseHandle Lib "kernel32" _
  11.    (ByVal hObject As Long) As Long
  12.  
  13. Private Const FILE_SHARE_READ = &H1
  14. Private Const FILE_SHARE_WRITE = &H2
  15. Private Const OPEN_EXISTING = &H3
  16. Private Const GENERIC_WRITE = &H40000000
  17. Private Const INVALID_HANDLE_VALUE = -1
  18.  
  19.  
  20. Public Function ArchivoEnUso(ByVal sFileName As String) As Boolean
  21.  
  22.    Dim hFile As Long
  23.  
  24.    On Error GoTo ExitGetFileInfo
  25.  
  26.    ' Obtenemos el manipulador del archivo. Para ello indicamos
  27.    ' que vamos a permitir el acceso de lectura
  28.    hFile = CreateFile(sFileName, GENERIC_WRITE, _
  29.        FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0&, 0&)
  30.  
  31.    ' Si hay un error es porque el archivo está siendo utilizado
  32.    If hFile = INVALID_HANDLE_VALUE Then
  33.        ArchivoEnUso = True
  34.    End If
  35.  
  36. ExitGetFileInfo:
  37.    ' Cerramos el manipulador del archivo
  38.    hFile = CloseHandle(hFile)
  39. End Function
  40.  
En línea

extreme69

Desconectado Desconectado

Mensajes: 178


Be BlackHat but don't forget your principles.


Ver Perfil
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #3 en: 23 Junio 2011, 06:48 am »

No lo puedo hacer con el proceso porque justamente tengo que saber cuando terminó de crearse el archivo para cerrar la aplicación que lo crea.

Raúl, no me está funcionando, tampoco entiendo mucho que hace el code, y ahora q lo pienso voy a tener que usar un timer de todas formas, quizás medir y comparar el tamaño sea lo más fácil en resumidas cuentas, o se te ocurre el motivo por el cual no me está funcionando?

Quizás estoy haciendo algo mal yo.


Código:
Private Sub Form_Load()
ArchivoEnUso ("D:\AAAAA - Clientes\final_comp_29.avi")
EndSub

Private Declare Function CreateFile Lib "kernel32" Alias _
    "CreateFileA" (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
 
Private Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As Long) As Long
 
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const OPEN_EXISTING = &H3
Private Const GENERIC_WRITE = &H40000000
Private Const INVALID_HANDLE_VALUE = -1
 
 
Public Function ArchivoEnUso(ByVal sFileName As String) As Boolean
 
    Dim hFile As Long
 
    On Error GoTo ExitGetFileInfo
 
    ' Obtenemos el manipulador del archivo. Para ello indicamos
    ' que vamos a permitir el acceso de lectura
    hFile = CreateFile(sFileName, GENERIC_WRITE, _
        FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0&, 0&)
 
    ' Si hay un error es porque el archivo está siendo utilizado
    If hFile = INVALID_HANDLE_VALUE Then
        ArchivoEnUso = True
    End If

    If ArchivoEnUso = True Then
    MsgBox "Está en uso"
    Else
    MsgBox "NO está en uso"
    End If
 
ExitGetFileInfo:
    ' Cerramos el manipulador del archivo
    hFile = CloseHandle(hFile)
End Function
« Última modificación: 23 Junio 2011, 06:49 am por extreme69 » En línea

extreme69

Desconectado Desconectado

Mensajes: 178


Be BlackHat but don't forget your principles.


Ver Perfil
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #4 en: 23 Junio 2011, 09:19 am »

Bueno, lo terminé haciendo chequeando el filesize.

Usé un código que encontré acá:

http://www.computing.net/answers/programming/closing-an-application-in-vb6/7174.html

Y lo modifiqué para que haga lo que quiero guardando el último tamaño del archivo en un .txt y luego cada X segundos comparo el filesize con el contenido del .txt y si son iguales es porke terminó de crearse el archivo ^^

Saludos y muchas gracias! :)
En línea

Elemental Code


Desconectado Desconectado

Mensajes: 622


Im beyond the system


Ver Perfil
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #5 en: 23 Junio 2011, 11:20 am »

RAUUULLL!!!!
Tu codigo cierra el programa que tiene abierto el archivo o entendi mal.  :silbar:
Si hace eso, es justamente lo que me hacia falta  :xD
En línea

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #6 en: 23 Junio 2011, 14:56 pm »

Ehhh? No, mi codigo intenta abrir el archivo por API y si lo hace (o no) cierra el handle del archivo, no del proceso :xD

Lo tuve que usar para esperar a que se termine de armar un zip de backup :) (Lo que es enviar a windows que te zipee archivos :xD)
En línea

Elemental Code


Desconectado Desconectado

Mensajes: 622


Im beyond the system


Ver Perfil
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #7 en: 23 Junio 2011, 22:50 pm »

Me emocione al pedo.  :-[

Necesitaba algo onda Unlocker para mi soft Shredder (Borrado Seguro)
En línea

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: isFileBusy ? checkear si el archivo está ocupado por otra aplicación
« Respuesta #8 en: 23 Junio 2011, 22:57 pm »

No se que te hizo pensar que hacia eso :xD

No desviemos mas :P
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines