Unter Linux Perl Dateinamen aendern

Hallo,

das Forum hier scheint ja kaum frequentiert zu sein!

Ich will es trotzdem mal probieren:

Ich lese mit einem Perl Programm emails aus und speichere die Datei-Anhaenge mit dem Modul MIME::stuck_out_tongue:arser unter dem Namen der in der Email fuer die Datei angegeben wurde.
Spaeter im Programm aendere ich dann den Dateinamen auf eine eindeutige Message Nummer mit einem move Befehl:
move($pfad.$AlterDateiName,$pfad.$NeuerDateiName);

Das funktioniert auch soweit ganz gut.

Nun werden aber von Windows Usern oftmals Dateinamen verwendet, bei denen das nicht funktioniert. z.B. hatte ich jetzt einen Dateinamen mit einem Komma drin.

Hat jemand eine Ahnung, wie ich den Move fuer den Dateinamen trotz Komma oder anderer aussergewoehnlicher Zeichen hinbekommen kann?

Danke fuer Eure Hilfe
Christian

Hallo Christian,

dann musst du beim alten Dateinamen alle Zeichen ersetzen, die nicht gültig sind - genauer gesagt, alle Zeichen ersetzen außer den gültigen (den Unterschied siehst du im regulären Ausdruck):

$GuterDateiName = $AlterDateiName;
$GuterDateiName =~ s/[^a-zA-Z0-9.-_ äöüÄÖÜß]/_/g;

Hier wird alles ( /g ) ersetzt ( s/// ) außer ( ^ ) den normalen Buchstabe, Zahlen, Punkt, Minus, Unterstrich, Leerzeichen und Umlauten (das Minus braucht einen Backslash). Weitere gültige Zeichen kannst du gerne noch zufügen. Hier hab ich einen Unterstrich zum ersetzen genommen, dann kann man sich meistens denken, was da gestanden haben könnte.

Bei einer Liste aller Zeichen, die ersetzt werden sollen ([Positivliste]), müsste in den eckigen Klammern das ^ am Anfang entfallen - aber welche Zeichen sind alle ungültig? Da ist es besser, die gültigen Zeichen in die Liste zu schreiben ([^Negativliste]) und damit alles andere ersetzen.

Aber noch eine Frage: wenn du immer den alten Dateinamen ersetzen willst, wieso nimmst du zwischendurch nicht einfach einen temporären Dateinamen, z.B. aus der MessageID + Zähler + .TYP? :wink:

Viele Grüße
Uwe

Hallo Uwe,

danke fuer Deinen Hinweis. Aber das Problem stellt sich noch etwas komplizierter.

Der MIME::stuck_out_tongue:arser zerlegt ja die Email und speichert die verschiedenen Teile auch, eben unter den Dateinamen, die in der Email stehen.

Das heisst, ich muss in jedem Fall den vom Email-Einreicher vergebenen Namen verwenden, um ihn dann in meinen eigenen mit einer Message ID umzuwandeln, da der ja schon auf der Festplatte steht.

Ist nun aber z.B. ein Komma im Dateinamen, dann klappt es nicht mit dem Move Befehl.
Das heisst die Datei wird schon auf die Festplatte geschrieben, aber wenn ich den Namen von dort lese. kann der move Befehl damit nichts anfangen.
Ich muss dann wahrscheinlich den alten Dateinamen irgendwie manipulieren, damit der move Befehl ihn auch verwenden kann.

Christian

Hallo Uwe,

danke fuer Deinen Hinweis. Aber das Problem stellt sich noch
etwas komplizierter.

Der MIME::stuck_out_tongue:arser zerlegt ja die Email und speichert die
verschiedenen Teile auch, eben unter den Dateinamen, die in
der Email stehen.

ich weisss nciht, ob das die ganze wahrheit ist. in der doku steht, dass man das steuern kann http://search.cpan.org/dist/MIME-tools/lib/MIME/Pars…
da steht zum einen, wie man das steuert und es steht auch da, welche funktionen man überschreiben muss.

ausserdem würde man das grundsaetzlich vermeiden, da die dateinamen ja durchaus im zieldateisystem ungültig sein können, oder einen angriffsvektor bieten.

Ist nun aber z.B. ein Komma im Dateinamen, dann klappt es
nicht mit dem Move Befehl.

was ist denn das für ein move befehl? das ist kein perl. welches modul benutzt du da? und was heisst klappt nicht - wie lautet die fehlermeldung?

im zweifelsfalle kannst du jeweils in die module schauen, wie im mime::stuck_out_tongue:arser und im move das save implementiert sind.

gruss joerg

move($pfad.$AlterDateiName,$pfad.$NeuerDateiName);

Wo hast du diesen seltsamen move-Befehl denn her? Komt der aus File::Copy? Denn eigentlich sind Zeichen wie ein Komma im Dateiname für perl überhaupt kein Problem, wie folgende shell-Befehle zeigen:

perl -e 'open IN, „>mit,Komma“;close IN ’
perl -e ‚rename „mit,Komma“,„ohne_Komma“‘

Gruß

Ja, der ist von File::Copy.

Danke fuer den Hinweis. Ich werde mal ein wenig herumprobieren!

Danke an alle.

vielleicht wird aus irgendwelchen gründen das komma als paramter trenner gesehen .

versuch mal mit ’ zu arbeiten .

Hallo,

also ich habe Deinen unten aufgefuehrten Befehl ausprobiert und es funktioniert auf der Konsole. Allerdings klappt das nicht in einem Perl Programm, Ich kann aber auch nicht erkennen weshalb nicht.

Ich muss die Dateinamen natuerlich direkt aus dem Pfad auslesen: Und mit den ausgelesenen daten funktioniert es dann eben nicht (Dateirechte stehen auf rw)

my $neudatei = '1232456.doc';
my $dirzw = .......;
opendir(DIR, $dirzw) and my @aPath = readdir(DIR) and closedir(DIR);

if(@aPath)
 {
 print "Ja, Dateien sind vorhanden: ".scalar(@aPath)."\n"; 
 foreach my $pdatei (@aPath)
 {
 print "Datei: $dirzw$pdatei\n"; 
 ### Next wenn keine normale Datei
 next unless(-f "$dirzw$pdatei");
 rename("$dirzw$pdatei","$dirzw$newdatei") 
 }
 }

Auf diesem Weg erfolgt KEINE Namensaenderung der Datei, wenn ein Komma enthalten ist, pbwohl der Dateiname mit Komma korrekt im print Befehl angezeigt wird

Gruss

Wo hast du diesen seltsamen move-Befehl denn her? Komt der aus
File::Copy? Denn eigentlich sind Zeichen wie ein Komma im
Dateiname für perl überhaupt kein Problem, wie folgende
shell-Befehle zeigen:

perl -e 'open IN, „>mit,Komma“;close IN ’
perl -e ‚rename „mit,Komma“,„ohne_Komma“‘

Gruß

wenn das mit dem ’ funktioniert, weiss ich den grund , glaub hab mal was gelesen,

das ganze wird wirklich einer art kommandozeile übergeben und da ensteht dann mit dem Komma das Problem , deswegen extra mit ’ übergeben .

da es bei allen ein problem ist, solltest du erstmal
mit ’ den namen umschliessen um effekte auszuschliessen .

Sorry Funktioniert!
Ich hatte da leider noch einen kleinen Fehler eingebaut.

Jetzt geht es einwandfrei

Danke nochmals

Chris