Windows: lange Dateinamen
Windows: lange Dateinamen
am 05.12.2006 22:20:17 von Stefan Seth
Hi,
ich möchte zu einem gegebenen kurzen Dateinamen à la "blubbe~1.txt" den
dazugehörigen Langnamen ("blubberfax.txt") bekommen. Mit
$lang = `dir $kurz /B`;
funktioniert das auf meinem Zuhauserechner (Win XP home, perl 5.8.7)
auch so. Im Büro (XP prof, perl 5.8.4) enthält $lang nach der Zuweisung
allerdings nur "blubbe~1.txt", obwohl "dir blubbe~1.txt /B" in der
Windows-Kommandozeile wie erwartet "blubberfax.txt" ausgibt. Liegt das
an der Perl-Version?
Umgangen habe ich das Problem mit:
system "dir $kurz /B > _lang";
open L, '< _lang';
$lang = ;
close L;
unlink '_lang';
Das klappt, nur scheint es mir reichlich unelegant. (Wie) geht das
besser?
Gruß
Stefan
--
Oben sei ein Kopf.
Re: Windows: lange Dateinamen
am 05.12.2006 23:49:53 von Wolf Behrenhoff
Stefan Seth schrieb:
> Hi,
>
> ich möchte zu einem gegebenen kurzen Dateinamen à la "blubbe~1.txt" den
> dazugehörigen Langnamen ("blubberfax.txt") bekommen. Mit
>
> $lang = `dir $kurz /B`;
>
> funktioniert das auf meinem Zuhauserechner (Win XP home, perl 5.8.7)
> auch so. Im Büro (XP prof, perl 5.8.4) enthält $lang nach der Zuweisung
> allerdings nur "blubbe~1.txt", obwohl "dir blubbe~1.txt /B" in der
> Windows-Kommandozeile wie erwartet "blubberfax.txt" ausgibt. Liegt das
> an der Perl-Version?
Das kann ich mir nicht vorstellen. Höchstens an der Windows-Version,
aber auch das kann ich mir nicht vorstellen.
Auf deinem Bürorechner verwendest du aber nicht zufällig die command.com
statt der cmd.exe?
Ansonsten halte ich es eh nicht für elegant, hier mit einem dir-Aufruf
zu kommen. Wenn zum Beispiel cygwin installiert ist und ein dir.exe im
Pfad liegt, kann es dir passieren, dass also das falsche dir ausgeführt
wird. Daher würde ich empfehlen, Windowsfunktionen zu nutzen. Ich würde
da also ein FindFirstFile ausführen (und ein FindClose machen) und dann
einfach den langen Dateinamen aus dem zurückgegebenen WIN32_FIND_DATA
auslesen - so geht es übrigens auch umgekehrt, denn dort findet sich
auch der 8.3-Dateiname.
Wolf
Re: Windows: lange Dateinamen
am 06.12.2006 23:20:03 von Stefan Seth
Wolf Behrenhoff schrieb:
> Stefan Seth schrieb:
>> ich möchte zu einem gegebenen kurzen Dateinamen à la
>> "blubbe~1.txt" den dazugehörigen Langnamen ("blubberfax.txt")
>> bekommen. Mit
>>
>> $lang = `dir $kurz /B`;
>>
>> funktioniert das auf meinem Zuhauserechner (Win XP home, perl
>> 5.8.7) auch so. Im Büro (XP prof, perl 5.8.4) enthält $lang nach
>> der Zuweisung allerdings nur "blubbe~1.txt", obwohl "dir
>> blubbe~1.txt /B" in der Windows-Kommandozeile wie erwartet
>> "blubberfax.txt" ausgibt. Liegt das an der Perl-Version?
>
> Das kann ich mir nicht vorstellen. Höchstens an der
> Windows-Version, aber auch das kann ich mir nicht vorstellen.
>
> Auf deinem Bürorechner verwendest du aber nicht zufällig die
> command.com statt der cmd.exe?
Im selben Fenster (Win-Taste + R --> cmd.exe):
$ dir blubbe~1.txt /B --> blubberfax.txt
$ perl -e "print `dir blubbe~1.txt /B`" --> blubbe~1.txt
Allerdings:
$ perl -e"print `cmd.exe /C dir blubbe~1.txt /B`" --> blubberfax.txt
So geht's dann doch.
> Ansonsten halte ich es eh nicht für elegant, hier mit einem
> dir-Aufruf zu kommen. Wenn zum Beispiel cygwin installiert ist und
> ein dir.exe im Pfad liegt, kann es dir passieren, dass also das
> falsche dir ausgeführt wird. Daher würde ich empfehlen,
cygwin kenne ich leider nicht. Aber da "cat blubberfax.txt" keine
Fehlermeldung bringt, ist es wohl installiert ... ;-) Könnte das der
Grund sein, warum die 2. Variante nur den kurzen Namen rausrückt?
> Windowsfunktionen zu nutzen. Ich würde da also ein FindFirstFile
> ausführen (und ein FindClose machen) und dann einfach den langen
> Dateinamen aus dem zurückgegebenen WIN32_FIND_DATA auslesen - so
> geht es übrigens auch umgekehrt, denn dort findet sich auch der
> 8.3-Dateiname.
Wer cygwin nicht kennt, der findet das nicht "einfach" ... ;-) Mit
Google habe ich nur ein paar, recht kompliziert aussehende Beispiele
gefunden, und in der Win::API-Doku finde ich nichts zu FindFirstFile.
Könntest Du ein Minimalbeispiel posten, wie man WIN32_FIND_DATA
ausliest?
Gruß
Stefan
--
Oben sei ein Kopf.
Re: Windows: lange Dateinamen
am 07.12.2006 01:05:40 von Wolf Behrenhoff
Stefan Seth schrieb:
> Wolf Behrenhoff schrieb:
>
>> Stefan Seth schrieb:
>>> ich möchte zu einem gegebenen kurzen Dateinamen à la
>>> "blubbe~1.txt" den dazugehörigen Langnamen ("blubberfax.txt")
>>> bekommen. Mit
>
> Im selben Fenster (Win-Taste + R --> cmd.exe):
> $ dir blubbe~1.txt /B --> blubberfax.txt
> $ perl -e "print `dir blubbe~1.txt /B`" --> blubbe~1.txt
>
> Allerdings:
> $ perl -e"print `cmd.exe /C dir blubbe~1.txt /B`" --> blubberfax.txt
>
>> Ansonsten halte ich es eh nicht für elegant, hier mit einem
>> dir-Aufruf zu kommen. Wenn zum Beispiel cygwin installiert ist und
>> ein dir.exe im Pfad liegt, kann es dir passieren, dass also das
>> falsche dir ausgeführt wird. Daher würde ich empfehlen,
>
> cygwin kenne ich leider nicht. Aber da "cat blubberfax.txt" keine
> Fehlermeldung bringt, ist es wohl installiert ... ;-) Könnte das der
> Grund sein, warum die 2. Variante nur den kurzen Namen rausrückt?
Ja. Ich habe bei mir die dir.exe von cygwin in xdir.exe umbenannt.
Das ergibt dann:
D:\>dir langer~1.txt /b
langerDateiname.txt
D:\>xdir langer~1.txt
langer~1.txt
Allerdings verträgt das dir.exe von cygwin eigentlich nicht den
/b-Parameter. Vielleicht solltest du mal "which dir" eingeben, um
herauszufinden, was passiert. (Achtung: das Which von cygwin findet wohl
nur .exe-Dateien, keine .com-Dateien)
>> Windowsfunktionen zu nutzen. Ich würde da also ein FindFirstFile
>> ausführen (und ein FindClose machen) und dann einfach den langen
>> Dateinamen aus dem zurückgegebenen WIN32_FIND_DATA auslesen - so
>> geht es übrigens auch umgekehrt, denn dort findet sich auch der
>> 8.3-Dateiname.
>
> Wer cygwin nicht kennt, der findet das nicht "einfach" ... ;-) Mit
> Google habe ich nur ein paar, recht kompliziert aussehende Beispiele
> gefunden, und in der Win::API-Doku finde ich nichts zu FindFirstFile.
> Könntest Du ein Minimalbeispiel posten, wie man WIN32_FIND_DATA
> ausliest?
Naja, cygwin hat ja mit der WinAPI nichts zu tun, ich sehe da den
Zusammenhang nicht.
Wie wäre es so:
use Win32::API;
sub getShortAndLongFilename {
my $FindFirstFile = Win32::API->new(
'kernel32', 'FindFirstFile', 'PP', 'N');
my $FindClose = Win32::API->new('kernel32', 'FindClose', 'N', 'N');
$info=' ' x 320;
$handle = $FindFirstFile->Call($_[0],$info);
$FindClose->Call($handle);
my $langerName=substr($info, 44);
$langerName=~s/\x00.*//s;
my $kurzerName=substr($info, 44+260);
$kurzerName=~s/\x00.*//s;
return ($kurzerName, $langerName);
}
my ($kurzerName, $langerName) = getShortAndLongFilename('d:\langer~1.txt');
print "Lang: '$langerName', Kurz: '$kurzerName'";
Wolf
Re: Windows: lange Dateinamen
am 08.12.2006 00:40:18 von Stefan Seth
Wolf Behrenhoff schrieb:
> Stefan Seth schrieb:
>> Wolf Behrenhoff schrieb:
>>> Stefan Seth schrieb:
>>>> ich möchte zu einem gegebenen kurzen Dateinamen à la
>>>> "blubbe~1.txt" den dazugehörigen Langnamen ("blubberfax.txt")
>>>> bekommen. Mit
>>
>> Im selben Fenster (Win-Taste + R --> cmd.exe):
>> $ dir blubbe~1.txt /B --> blubberfax.txt
>> $ perl -e "print `dir blubbe~1.txt /B`" --> blubbe~1.txt
>>
>> Allerdings:
>> $ perl -e"print `cmd.exe /C dir blubbe~1.txt /B`" -->
>> blubberfax.txt
>>
>>> [cygwin installiert?]
>
> Allerdings verträgt das dir.exe von cygwin eigentlich nicht den
> /b-Parameter.
Verträgt's auch bei mir nicht, muß ich gestehen. Die Ausgabe von
$ perl -e "print `dir blubbe~1.txt /B`"
ist nämlich zweizeilig:
blubbe~1.txt
dir: /b: no such file or directory
Die zweite Zeile hatte mein Gedächtnis unterschlagen, weil ich die
Fehlermeldung nicht verstanden hatte. Dabei hätte schon die Sprache
stutzig machen können ...
> Vielleicht solltest du mal "which dir" eingeben, um
> herauszufinden, was passiert. (Achtung: das Which von cygwin
> findet wohl nur .exe-Dateien, keine .com-Dateien)
/usr/bin/dir
Das Rätsel ist wohl gelöst.
>>> Windowsfunktionen zu nutzen. Ich würde da also ein FindFirstFile
>>> ausführen (und ein FindClose machen) und dann einfach den langen
>>> Dateinamen aus dem zurückgegebenen WIN32_FIND_DATA auslesen - so
>>> geht es übrigens auch umgekehrt, denn dort findet sich auch der
>>> 8.3-Dateiname.
>
> Wie wäre es so:
> [..]
Herzlichen Dank! Habe ich jetzt halbwegs verstanden, hätte ich aber
nicht selbst schreiben können.
Gruß
Stefan
--
Melke: Hu is president.