Schrift
[thread]12977[/thread]

Dateinamen mit Sonderzeichen / DOS-Kommandos

Leser: 6


<< >> 4 Einträge, 1 Seite
Pumuckel
 2009-01-10 20:05
#117837 #117837
User since
2009-01-10
2 Artikel
BenutzerIn
[default_avatar]
Hi,

ich parse unter Win Dateinamen (aus NTFS-Dateisystem), die alle möglichen Sonderzeichen enthalten. Das Einlesen mit opendir war nicht erfolgreich, da kamen bei den problematischen Dateien nur 8.3-gekürzte an. (Lange Dateinamen oder "normal codierte" Umlaute waren nicht das Problem, da funktionierte opendir problemlos.) Die Sonderzeichen habe ich so in den Griff bekommen:

Code: (dl )
1
2
3
my $cmd = 'cmd.exe /u /c dir /B "'.$dir.'" 2>&1';
my $cmdResult = qx($cmd);
$cmdResult = decode('utf16le', $cmdResult);


So liefert das dir-Kommando Unicode zurück, aus dem ich mit decode auch die vollständigen Dateinamen erhalte. Diese Dateien möchte ich jetzt umbenennen. Das Ersetzen der Sonderzeichen funktioniert problemlos (zB /\x{251c}\x{255d}/ue/). Der neue Dateiname ist also Sonderzeichen-frei.

Mein Problem: Setze ich jetzt das DOS rename-Kommando mittels qx ab, schlägt das fehl ("Das System kann den angegebenen Pfad nicht finden."). Rename selbst in einer DOS-Box auf eine problematische Datei abgesetzt funktioniert. Der alte Dateiname enthält noch die Sonderzeichen, und die werden einfach nicht "richtig" übergeben. Ich habe schon versucht stdout mittels binmode auf OEM zu setzen, ebenso den alten Dateinamen in alles mögliche zu codieren: Nichts funktioniert.

Wie müsste man da vorgehen?
esskar
 2009-01-10 21:02
#117847 #117847
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
vielleicht doch besser mit CPAN:Win32::FileOp arbeiten
Pumuckel
 2009-01-11 01:32
#117856 #117856
User since
2009-01-10
2 Artikel
BenutzerIn
[default_avatar]
Hi,

interessante Idee, leider genau das gleiche Problem. Nur das eine entsprechende Fehlermeldung dann als GUI-Dialog kommt.

Ein Stück bin ich weiter: Ich lese die Verzeichnisse ein zweites Mal ohne den /u Switch für die cmd.exe aus. Die damit erhaltenen Namen erhalten ein encode nach iso-8859-1. (Die Zielnamen werden weiterhin wie oben beschrieben vorbereitet.) So funktioniert das auch! Zumindest fuer alle ehemaligen ö's und ü's. Bei den ä's funktioniert es nicht?!?

Das rekonstruierte Mapping sah bisher so aus:
Code: (dl )
1
2
3
'\x{251c}\x{255d}' => 'ue',
'\x{251c}\x{2562}' => 'oe',
'\x{251c}\x{f1}' => 'ae',

Man sieht den Unterschied für das ä im Vergleich zu ö oder ü. Aber genauso sehen die ä's nach dem encode aus.

Beispiele:
(a) Dir mit Unicode-Ausgabe und encode zu utf16le: "2008-07-08 Grundfl\x{251c}\x{f1}chen und Rauminhalte.pdf"
(b) Dir ohne Uniocde-Ausgabe: '2008-07-08 Grundfl&#9500;ñchen und Rauminhalte.pdf' (Lt. Vorschau ersetzt das Forum hier ein Sonderzeichen durch "&#9500;".)
(c) Dir ohne Unicode-Ausgabe und encode zu iso-8859-1: '2008-07-08 Grundfl?±chen und Rauminhalte.pdf'

(c) wurde wie oben beschrieben genutzt um das rename auf den ursprünglichen Dateinamen abzusetzen, was für ü/ö funktioniert und für ä nicht.

Ziemlich absurd das ganze. Bin ich auf dem völlig falschen Dampfer? Hat noch jmd. Rat?
esskar
 2009-01-11 16:44
#117860 #117860
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi;
versuch dich mal hier durchzukämpfen: http://www.nntp.perl.org/group/perl.libwin32/2006/...
<< >> 4 Einträge, 1 Seite



View all threads created 2009-01-10 20:05.