Kurt: IO bzw. CGI.pm Upload speichern

Beitrag lesen

Hi

danke für die ausführliche Antwort, hier kann man ja tatsächlich noch richtig was dazulernen! ;-)

mag ja sein, aber ich will das File nicht kopieren sondern per verschieben. Sprich einen Hardlink anlegen. In perl akzeptiert "link" aber keine Filehandles.

In der darunter liegenden Kernel-Schnittstelle (link(2)) auch nicht.

Tja aber den Grund dafür kann ich nicht nachvollziehen ...

Nicht ohne den Namen der Datei, richtig. Würde ich aber ohnehin nicht machen, denn das CGI-Modul ist sehr bestrebt, die Temp-Files wieder zu löschen. Und statt mv aufzurufen, würde ich ganz generell lieber File::Copy::move() benutzen.

ohne es jetzt wieder nachschlagen zu wollen ... ok cut und paste geht schneller ;)
"Note that passing in files as handles instead of names may lead to loss of information on some operating systems; it is recommended that you use file names whenever possible. "

Das OS *kann* keine Kopien anfertigen, das machen Hilfsprogramme wie cp und dd. Und die machen abwechselnd read() und write() auf einen einmal angelegten Buffer. Exakt das macht Perl auch, mit unwesentlich mehr overhead.

Hast dus gebenchmarkt? Na das glaub ich dir jetzt mal.

Kennst Du File::Copy::copy()? Das sollte Dir die ganze Kopiererei abnehmen. Und es kopiert in bis zu 2 MB großen Blöcken.

ups das Zitat oben war von File::Copy::copy(). Move will einen Namen für den Sourceparameter.

The "move" function also takes two parameters: the current name and the intended name of the file to be moved.

stimmt ... leider ... eine FS-Funktion die mir die Pfade aller Hardlinks zu einem Handle ausspuckt wär wirklich nett...schöner Traum...

Aus OS-Sicht wäre das ein Alptraum. Spätestens mit Hardlinks auf Directories.

Ok zugegeben, an die Dir-hardlinks hab ich jetzt nicht gedacht...

Hab ich auch gerade mal gemacht, ist tatsächlich nicht drin. Sorry.

Naja du warst ja scheinbar lange weg, die Freude macht übermütig mit dem "RTFM" ;)

Die Fh-Klasse in CGI.pm gibt sich alle Mühe, den Namen zu verstecken. $query->tmpFileName($upload_fh) sollte den Namen der Temp-Datei ausgeben, wie ich das auf die Schnelle sehe. Die DESTROY-Methode gibt sich aber alle Mühe, Dateien unter Kontrolle von CGI.pm zu löschen, entweder per Handle oder per Namen.

OK, aber wir sind uns einig das ein umbenennen des Tempfiles immer noch sauberer ist als umkopieren. In einen idealen Welt hätte CGI.pm eine Methode link_tmpfile($dest_path).

In der Doc steht noch was vom UPLOAD_HOOK und das ein unspezifizierter Parameter $buffer geliefert wird ?!?
Mit Verweis auf Apache::Upload Objekte. Und siehe da , hier gibts ne Methode link().

http://search.cpan.org/~joesuf/libapreq-1.3/Request/Request.pm#link
To avoid recopying the spool file on a *nix-like system, link will create a hard link to it:

Ich halte ein move bzw link immer noch für den sauberen Ansatz, beherzige aber Damian Conways Ratschlag erst zu benchmarken bevor man zu optimieren anfängt. Wenn keinen die Kopiererei stört, lass ichs mal gut sein.

Bye
 Kurt