Ich scheitere an folgendem Problem:
Files werden per FTP und durch ein move von anderen Servern in ein Verzeichniss auf einem WIN NT 4 Server übertragen. Perl Script überwacht den den Ordner. Mein Problem: erkennen das die Datei fertig mit der Übertragung ist. Leider kein Einfluss auf den FTP Prozess.
flock hat nicht geholfen,
Überprüfung von Argumenten mit Hilfe von ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(catfile($INPUT[0],$file));
dann sleep (5)
und erneutes test mit ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(catfile($INPUT[0],$file)); geben kein Ansatz zur Aussage Datei ist vollständig da oder nicht.
Wer kann mir bitte an der Stelle etwas Unterstüzung geben ?
Vielen Dank
Rufio
User since
2003-08-04
2536
Artikel
ModeratorIn
kannst du dem perlscript nicht irgendwie etwas über die datei mitteilen?
du könntest zum beispiel vielleicht die dateigröße im dateinamen verschlüsseln oder eine checksum im namen unterbringen - dann kann das perlscript bequem prüfen.
User since
2003-08-21
2614
Artikel
ModeratorIn
Kannst Du feststellen, ob der FTP Daemon die Datei noch zum Schreiben geoeffnet hat? Keine Ahnung, ob das unter NT geht, aber so mach ich das immer ;)
User since
2003-08-04
14371
Artikel
ModeratorIn
Erstelle Prüfsummen von den Dateiinhalten. Wenn beide Prüfsummen gleich sind, ist die Übertragung fertig...
User since
2003-08-04
1706
Artikel
HausmeisterIn
Dazu kannst du zum Beispiel das in der Standard Distributution enthaltenen
Digest::MD5
use Digest::MD5;
my $file = shift || "/etc/passwd";
open(FILE, $file) or die "Can't open '$file': $!";
binmode(FILE);
print Digest::MD5->new->addfile(*FILE)->hexdigest, " $file\n";
Edit:
Jedoch kann es bei dem Algorithmus vorkommen dass nicht immer der String eindeutig ist. Die Wahrscheinlichkeit ist zwar gering aber da. Alternative ist
Digest::SHA1.
Hier ein kleiner Geschwinigkeitstest, der wie erwartet ausgefallen ist:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use Digest::MD5;
use Digest::SHA1;
use Benchmark;
my $md5 = Digest::MD5->new();
my $sha1 = Digest::SHA1->new();
open FILE,'<',$0 or die $!;
binmode FILE;
sub check_md5 {
$md5->addfile(*FILE)->hexdigest(),"\n";
}
sub check_sha1 {
$sha1->addfile(*FILE)->hexdigest(),"\n";
}
timethese(10_000_000,{
'Digest::MD5'=> \&check_md5,
'Digest::SHA1' => \&check_sha1
}
);
_ _ END _ _
Benchmark: timing 10000000 iterations of Digest::MD5, Digest::SHA1...
Digest::MD5: 27 wallclock secs (26.73 usr + -0.01 sys = 26.72 CPU) @ 374251.50/s (n=10000000)
Digest::SHA1: 43 wallclock secs (43.20 usr + 0.00 sys = 43.20 CPU) @ 231465.41/s (n=10000000)
Gruß Alex\n\n
<!--EDIT|format_c|1105946299-->
User since
2003-12-22
7
Artikel
BenutzerIn
Danke für Eure Beiträge.
Ich habe leider weder Einfluss auf den Dateinamen, noch auf den Zeitpunkt. Hätte ich den Einfluss auf Dateinamen würde ich es als *.temp übertragen und anschliessend auf echte Prefix switchen. So könnte man dem Problem aus dem Weg gehen.
Es muss doch eine Möglichkeit geben das anhand eines Merkmales der Datei zu erkennen.
Rufio
User since
2003-08-04
14371
Artikel
ModeratorIn
was ist an der checksummen-methode so schlecht??
Das einzige, was mir sonst noch einfällt ist, dass Du die Dateigröße auf dem Server ermitteln könntest und immer wieder die Dateigröße auf dem dem Empfänger. Ändert die Größe sich nicht mehr, findet keine Übertragung mehr statt. Ist die Dateigröße auf dem Empfänger gleich der Größe auf dem Sender, dann war die Übertragung erfolgreich, ansonsten fehlerhaft...
User since
2003-12-22
7
Artikel
BenutzerIn
Hallo Renee,
Problem ist, dass ich nicht derjenige bin, der die Datei überträgt. Ich bin nur für die Weiterverarbeitung zuständig.
Ich habe kein Zugriff und kein Einfluss auf den übertragenden Server.
Rufio
User since
2004-07-19
1776
Artikel
HausmeisterIn
[quote=betterworld,17.01.2005, 01:01]Kannst Du feststellen, ob der FTP Daemon die Datei noch zum Schreiben geoeffnet hat? Keine Ahnung, ob das unter NT geht, aber so mach ich das immer ;)[/quote]
Analog zu
fuser funktioniert unter Win32 das Programm
Handle, das allerdings nicht zum Standardumfang von Windows gehört.
Auf jeden Fall sollte man das Problem damit lösen können.
When C++ is your hammer, every problem looks like your thumb.
User since
2003-12-22
7
Artikel
BenutzerIn
Danke - das probiere ich aus.
Danke auch für die Links.
Rufio