Hier ein Tipp wie man den langen Dateinamen einer Datei erhällt. Zwar gibt es Tipps wie mal lange Pfadname zurückbekommt, hier aber eine kurze Version nur für Dateinamen. Benötigt wird es immer dann, wenn nur der Dateiname, aber nicht der Pfad interresiert (z.B. Dateinamen in TListView anzeigen).
Noch eine kleine Besonderheit der Funktion: es wird der Dateiname so angezeigt wie es im System vereinbart wurde, d.h. ist im System eingestellt, daß registrierte Dateierweiterungen nicht angezeigt werden sollen, dann wird das auch hier beachtet. So wird z.B. die Datei 'C:\TextDatei.txt', wenn registrierte Dateitypen nicht angezeigt werden, als "TextDatei" angezeigt, sonst "TextDatei.txt". Aber, ein Ordner mit der Bezeichnung "C:\Neuer Ordner.txt" wird immer als "Neuer Ordner.txt" angezeigt, da diese Einstellung nicht für Ordner gilt.
Die Funktion erwartet zwei Parameter:
- DateiName
- False, wenn Dateiname so zurückkommen soll wie im System vereinbart wurde, oder True, wenn auf jeden Fall die Erweiterung zurückgegeben werden soll.
Das Ergebnis ist der lange Dateiname, wenn Dateiname vorhanden ist, oder Nullstring (#0) wenn keine Datei gefunden wurde:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| uses ShellApi;
function GetLongFileName(const FileName: String; RegExt: Boolean): String; var sfi: TSHFILEINFO; begin if SHGetFileInfo(PChar(FileName), 0, sfi, SizeOf(sfi), SHGFI_DISPLAYNAME) <> 0 then begin Result := sfi.szDisplayName; if RegExt then begin if CompareText(ExtractFileExt(FileName), ExtractFileExt(Result)) <> 0 then Result := Result + ExtractFileExt(FileName); end; end else Result := #0; end; |
Beispiele:
Hier wird aus "C:\EIGENE~1" ein "Eigene Dateien":
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetLongFileName('C:\EIGENE~1', True)); end; |
Aus "C:\AutoExec.bat" wird "AutoExec", wenn eingestellt wurde, daß registrierte Dateitypen im Explorer nicht angezeigt werden sollen:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetLongFileName('C:\AutoExec.bat', False)); end; |