Newsgroup: it.comp.lang.perl
Titolo: verificare se esiste un file ed aprirlo in modo esclusivo

ciao a tutti, dovrei fare un ciclo che processa alcuni file .txt presenti in 
una cartella nel mio server linux... ho una procedura che cicla tutti i file 
di una certa cartella.... il problema è che non so come visualizzare se il 
file è pronto (ovvero se l'utente ha finito il download via ftp), come posso 
fare? 

 [...]
Non ho capito.
Devi processare i file sul server o in locale?
Li processi tu o l'utente?
Ci accedi via ssh e li processi o via FTP?
Deve essere un processo saltuario, periodico, prima del download o dopo?
-- 
Per risposte private: 
vitto....@SPAMMAREtiscali.it
sito: 
http://nathanvi.it
FAQ OpenOffice: 
http://openoffice.nathanvi.it
Centro Studi Raffaello:
http://centrostudiraffaello.it/sito/
Inviato da 
www.mynewsgate.net

, scriveva:

In generale, il modo sicuro per assicurarsi dell'esistenza e della
disponibilità di un file è tentare di aprirlo e verificare se l'apertura è
andata a buon fine.
Il processo che lo0 deve scrivere, da parte sua, avrà provveduto ad
effettuare un lock. Le due cose insieme dovrebbero dare quello che cerchi
se ho capito il problema.
Se serve un coordinamento più diretto delle due operazioni, ci sono diverse
opzioni (semafori e altro), la cui scelta dipende però da quello che devi
fare in dettaglio.
Ciao.

ho un server linux in cui gli utenti di una mia applicazione windows salvano 
via ftp un file .txt
ho uno script perl che dovrebbe lavorare in maniera ciclica per verificare 
la presenza di file .txt in una cartella e processarli... il problema è che 
lo script è talmente veloce che mi apre il file prima ancora che l'ftp abbia 
finito di salvare i dati contenuti
Simone 

ancora che l'ftp abbia finito di salvare i dati contenuti
La sessione ftp dovrebbe bloccare il file, in modo che non sia possibile
aprirlo mentre lo sta scrivendo. Altrimenti, si può creare un semaforo di
qualche tipo; per esempio, un altro file che viene generato o eliminato
all'inizio dell'operazione ftp ed eliminato o generato al termine.
Ciao.

 abbia finito di salvare i dati contenuti
Tre opzioni.
Se chi trasmette il file può adeguarsi a una tua specifica, è sufficiente
che il file venga trasferito con un nome speciale (che tu ignorerai) e
quindi rinomintato a fine operazione.
Un'altra possibiltà, sempre con la cooperazione di chi invia il file, è
incorporare nel nome del file l'indicazione delle sue dimensioni.
Altrimenti, puoi verificare nelle caratteristiche del server FTP, se esiste
una modalità di funzionamento in cui i file non vengono fatti comparire con
il loro nome definitivo fino a quanto il trasferimento non è completato.
Questo è, ad esempio, possibile con Proftpd (v. direttiva HiddenStor).
Max

Simone P. wrote:

Oltre a quanto già correttamente suggerito da Max riguardo ProFTPD, 
posso aggiungere che, se usi il server FTP Pure-FTTPd
http://www.pureftpd.org/
puoi utilizzare lo script 'pure-uploadscript' (incluso nel package,) il 
quale lancia automaticamente un programma esterno (da te scelto) quando 
è terminato con successo un upload.
Serve proprio per i tuoi scopi, e risparmia al tuo script la necessità 
di fare il polling della directory.
****
Se per sfiga usi un server FTP che non ha queste funzioni, 
un'alternativa potrebbe essere quella di monitorare il file di log (ogni 
server FTP degno di questo nome logga i propri eventi, via syslog o da 
qualche altra parte,) e processare il tuo file solo quando leggi il 
corrispondente messaggio di upload concluso.
Visto che sei su Linux, un'altra soluzione, più elegante, potrebbe 
essere quella di esaminare
/proc/[number]/fd
per ogni path ottenuto sostituendo [number] col PID del server FTP e di 
ogni suo eventuale processo figlio: in questo modo vedi su quali file il 
server sta (ancora) scrivendo e ne skippi l'elaborazione.
Infine ci sarebbero dei programmi di monitoraggio del filesystem 
(dnotify, fam etc.,) che si attivano in deguito ad alcuni eventi del 
filesystem... Ma direi che di carne al fuoco ce n'è già abbastanza.
Ciao,
Emanuele.

grandioso... credo che risolverň cosě...
grazie