User since
2008-02-26
11
Artikel
BenutzerIn
Verzwicktes Problem:
$unc_z ergibt z.B. \\192.168.0.20\c$\\
und $file_name wäre \\192.168.0.20\c$\datei.txt
$unc_z="\\\\$remote{$hsh_key}\\c\$\\";
$file_name="$unc_z$temp.$hsh_key";
rename ($file_name, $file_name."\.md5err");
Rename kopiert die Datei einfach mit der Endung .md5err und die Originaldatei bleibt bestehen! Ok, habe ich mir gedacht, machst über Umweg: erst copy, dann unlink, aber die Originaldatei lässt sich mit nichts löschen! Über den Explorer kann ich die Datei Problemlos löschen, während das Script läuft habe ich auch keine Dateihandles offen. Was mache ich falsch? Wie kann ich eine Datei übers Netzwerk "rename"´en?
User since
2005-01-17
14784
Artikel
Admin1
Sowas geht doch:
use strict;
use warnings;
my $unc_z = '\\\DEV\x$';
my $temp = '\tmp';
my $file_name = $unc_z . $temp .'\ht.txt';
rename ($file_name, $file_name. '.md5err') or die ("$!: $file_name");
Du escapest einfach nur zu viel in deinen Strings. ;)
Aber rename kopiert
nicht, sondern benennt um.
Willst du nun kopieren oder umbenennen?
Kopieren geht so:
use strict;
use warnings;
use File::Copy;
my $unc_z = '\\\DEV\x$';
my $temp = '\tmp';
my $file_name = $unc_z . $temp .'\ht.txt';
copy( $file_name, $file_name. '.md5err') or die ("$!: $file_name");
So, hab jetzt mein Passwort nicht im Kopf, schreibe daher mal als Gast und nicht als oes:
Also, ich hatte auch daran gedacht, ob ich nicht vielleicht zuviel escape habe, daher habe ich auch andere Schreibweisen ausprobiert, ohne Erfolg.
Also, ich will umbenennen, benutze rename, aber rename kopiert die Datei und lässt die originale einfach bestehen. Das liegt sicher daran, dass ich die Datei warum auch immer, mit meiner Syntax nicht löschen kann. Probier meinen Codeschnipsel mal aus, dann wirst Du höchstwahrscheinlich auf das gleiche Ergebnis kommen. Kanns ja als unc-Pfad die IP Deines lokalen Rechners nehmen.
User since
2005-01-17
14784
Artikel
Admin1
Hast du strict und warnings aktiviert?
#!/usr/bin/perl
use strict;
use warnings;
#$unc_z ergibt z.B. \\192.168.0.20\c$\\
#$file_name wäre \\192.168.0.20\c$\datei.txt
my $unc_z="\\\\192.168.50.1\\x\$\\";
my $temp='datei';
my $hsh_key='txt';
my $file_name="$unc_z$temp.$hsh_key";
rename ($file_name, $file_name."\.md5err");
Benennt bei mir korrekt über das Netzwerk die Datei Datei.txt in Datei.md5err um.
Was hast denn du für ein Netzwerk am laufen?
Irgendeinen Fileserver?
User since
2007-05-11
923
Artikel
HausmeisterIn
Eventuell mal mit File::Copy::move probieren.
Verdamm mich in die Ecke ... wenns bei Dir einwandfrei funktioniert ist bei mir irgendwo irgendein Byte falsch. Ist aber gut zu wissen, dass es Dir funktioniert, dann muss ich halt schauen was ich falsch mache. strict und warnings sind immer aktiviert.
"rename" schreibt seine fehler in "$!" frag das doch mal ab
User since
2008-02-26
11
Artikel
BenutzerIn
Problem gelöst, musste aber viel probieren:
Die Situation:
Die umzubenennende Datei, wird auf den Zielrechner KOPIERT (copy). Dann kontrolliere ich durch eine md5-Prüfsumme ob die Datei fehlerfrei kopiert worden ist. Wenn keine unterschiede in der Prüfsumme, dann wird die Quelldatei gelöscht. Bei unterschieden in der Prüfsumme, soll die Zieldatei in *.md5_err umbenannt werden und die Quelldatei bleibt.
Das funktioniert so nicht!
rename ($zieldatei, "$zieldatei.md5_err") erstellt eine Kopie von $zieldatei als "$zieldatei.md5_err" und lässt $zieldatei einfach stehen. Also kein wirkliches "rename", sondern wirklich nur eine Art "copy".
Meine Lösung:
Ich erstelle zunächst eine Kopie der Quelldatei. Dann benutze ich "move" zum Zielrechner und siehe da: rename funtioniert wie erwartet.
Merke:
Mit copy verschobene Dateien können nicht sofort "renamed" werden.
Mich hats fast zur Weißglut gebracht. Sad but true.
User since
2007-05-11
923
Artikel
HausmeisterIn
rename hat einige Einschränkungen, es funktioniert z.B. nicht über Dateisystemgrenzen hinweg. Weshalb ich ja auch gleich move vorgeschlagen habe ;-)