2011-01-14 10 views
5

Tengo un script PHP que abre un directorio local para copiar y procesar algunos archivos. Pero estos archivos pueden estar incompletos, porque se cargan mediante un lento proceso de FTP y no quiero copiar ni procesar ningún archivo que aún no se haya cargado por completo.Detectar con php si se están cargando archivos, o está abierto

¿Es posible en PHP averiguar si un archivo todavía se está copiando (es decir, leyendo), o está escrito en?

Necesito mi script para procesar solo los archivos que se han cargado por completo.

El proceso ftp ahora, cargar archivos en paralelo, y se tarda más de 1 segundo para cada tamaño de archivo para cambiar, por lo que este truco no funciona para mí ahora, cualquier otro método sugiere

Respuesta

4

¿Tiene control de la acción sobre el proceso de FTP? Si es así, haga que la secuencia de comandos que está cargando cargue un archivo [FILENAME] .plelle (archivo de texto en blanco) una vez completada la carga principal, de modo que la secuencia de comandos de proceso sepa que el archivo está completo si también hay un archivo * complet correspondiente.

+0

este es el problema, no tengo el control del script de carga, solo tengo una carpeta donde puedo encontrar mis archivos para procesar en cualquier momento, así que tengo que detectar si los archivos son completado o no – albanx

3

+1 a @MidnightLightning por su excelente sugerencia. Si no tiene control sobre el proceso, tiene un par de opciones:

Si sabe cuál es el tamaño final del archivo, utilice filesize() para comparar el tamaño actual con el tamaño conocido. Sigue comprobando hasta que coincidan.

Si no sabe cuál es el tamaño final, se pone un poco más complicado. Puede usar filesize() para verificar el tamaño del archivo, espere uno o dos y vuelva a verificarlo. Si el tamaño no ha cambiado, la carga debería estar completa. El problema con el segundo método es si su carga de archivos se detiene por el motivo que sea, podría dar un falso positivo. Entonces, el tiempo de esperar es la clave.

+0

+1; Iba a sugerir esto también, si no tienes control de los archivos. – MidnightLightning

+0

También probé esa solución, y a veces funciona, pero el proceso ftp ahora, carga archivos en paralelo y tarda más de 1 segundo en cambiar el tamaño del archivo, por lo que este truco no funciona ahora, ningún otro método sugiere? – albanx

+0

@albanx - Creo que su única opción en ese caso sería aumentar el tiempo de espera. O compruebe varias veces antes de decidir que la carga se ha detenido – Cfreak

2

No especifica en qué tipo de sistema operativo está, pero si se trata de un cuadro de tipo Unix, debe tener fuser y/o lsof disponibles. fuser informará sobre quién está usando un archivo en particular, e lsof listará todos los archivos abiertos (incluidos sockets, fifos, .so's, etc.). Cualquiera de estos podría ser usado para monitorear su directorio.

En el lado de la ventana, hay algunas herramientas gratuitas de Sysinternals que hacen lo mismo. handle podría hacer el truco

+0

lo siento, desafortunadamente tengo Windows Server 2008 – albanx

Cuestiones relacionadas