2015-02-24 2 views
-1

Je voudrais construire en Perl sous Windows un chien de garde pour un Hot-Folder (je pourrais l'appeler Folder-Watch ou, hmm, probablement beaucoup mieux: un Hot-Dog). Jusqu'à présent, j'ai réussi à faire exactement cela, avec Win32::ChangeNotify (voir l'exemple ci-dessous).Découvrez en Perl et Windows si un fichier est accessible en écriture/amovible

Mais comme vous pouvez le deviner à lire le code source, je suis tombé sur un problème lorsque le processus mobile veut terminer lorsque la copie/création de processus du fichier dans $watchdir n'a pas fini (Aucun fichier ou répertoire).

use Win32::ChangeNotifier; 
use File::Copy qw(move); 

my $notify = Win32::ChangeNotify->new($watchdir, 0, "FILE_NAME"); 
while (1) { 
    if ($notify->wait(1_000)) { # 1-second wait cycle 
    notify->reset; 
    @foundfiles = File::get_by_ext($watchdir, "csv"); # search and return files in $watchdir with extension "csv" 
    print "Something has happened! (del/ren/create)\n"; 
    foreach (@foundfiles) { 
     move($watchdir.$_, $someotherdir.$_) or die "Fehler: $!"; 
    } 
    @foundfiles =(); 
    } 
} 

est-il un moyen de trouver automatiquement si le fichier est prêt à aller, à savoir a été finalement créé/copié?

Je pensais à quelque chose comme

while (1) { 
    move $file if (-w $file) # writeable 
    wait(1) 
} 

mais cela ne semble pas fonctionner sous Windows. J'ai besoin de résoudre cela sous Windows ainsi que Perl. À part cela, je suis ouvert aux suggestions.

+0

Hmm, peut-être en vérifiant si je peux ouvrir le fichier avec un handle de fichier ...!? –

+1

'sub writeable {ouvre mon $ fh," >> ", shift}' ':)' –

+0

Je ne sais pas pourquoi vous pensez que '-w' devrait vous dire que personne n'écrit dans un fichier. Il y a peut-être des moyens spécifiques à l'OS de vérifier si un fichier est utilisé, mais je ne suis pas au courant. – ikegami

Répondre

1

Oui! Je l'ai résolu (merci à Сухой27)!

Insérer le code suivant à droite avant de déplacer le fichier:

while (1) { 
    last if writeable($path_in.$_); 
    print "-"; 
    $| = 1; 
    sleep(1); 
} 

... alors que writeable fait référence à ce petit sous-marin:

sub writeable { 
    return open(my $file, ">>", shift); 
} 

Merci, et ont un jour Nive! :-)