![]() |
TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Hallo zusammen,
... edt1.Text:= 'c:\Lieder\$$$$$$_sdsfdsfdsfdsfdsfsd321fdsfdsf31ds f1dsf1ds3f1dsf1ds3f1ds31fds31f1dsf1dsf31dsf321ds1f ds31fds321f1dsf1dsf31ds32f1ds1f3ds1f3d2sf1ds32f1ds 3fds3f1ds3f1ds31fds1f312dsf312dsf31ds1fds31fds32f1 dsf1ds3f1ds3f12ds13fds132fsed\27 - Ieva Zasimauskaitė (Lithuania) - When We're Old.mp3' // das sind 285 Zeichen... …
Delphi-Quellcode:
var
FS: TFileStream; begin try FS := TFileStream.Create(edt1.Text, fmOpenRead); finally FS.Free; end; end; Laut Delphi Hilfe kann ich keine Grenze bei TFileStream wegen Pfadlänge oder Unicodezeichen erkennen. Weiß jemand warum Delphi crasht und die Meldung bringt: Datei nicht gefunden? Vielen Dank schon mal im Voraus! |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
NTFS Wikipedia:
...Dateinamen können... bis zu 255 Zeichen lang sein und aus fast beliebigen Unicode-Zeichen bestehen... ...eine maximale Länge des kompletten Pfadnamens von 32.767 Zeichen (allerdings beschränkt Windows bis zur Version Windows 10 Build 14352 die nutzbare Länge auf 260 Zeichen)... |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Kann mir nur vorstellen das der Pfad einfach zu lang ist.
Mit dem FileStream hat das nichts zu tun. MAX_PATH ?? 260.. du hast aber 285 oops da war jemand schneller. gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Windows lässt die Pfadlänge > 260 zu und andere Programme kommen auch mit der Pfadlänge > 259 klar.
Ich hatte nun angenommen, dass TFileStream mit der Pfadlänge > 259 kein Problem hätte. Im Moment weiß ich noch nicht wie ich das umgehen kann. |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Wenn Du ein commandprompt öffnest und da diese Zeichenkette reinkopierst und Return drückst, was passiert?
edit Zitat:
Helfen kann es den Namen in den ShortName umzuwandeln! |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Ich denke es sind die Leerzeichen zwischen dem String.
Zitat:
Kann jetzt aber nicht sagen ob der String den du hier reinkopiert hast verändert wird. Windows meldet mir das die Datei nicht gefunden wird. Zitat:
gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Ich hab da eher das "$" Zeichen in Verdacht aber der TE soll mal was dazu sagen:wink:
|
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Gebe ich den String so unter Ausführen im Startmenü ein wird alles abgeschnitten was länger ist wie 260 gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Problem gelöst!
Es ist die Verwendung des MAX_Path die angewendet wird, wenn eine direkte Pfadangabe verwendet wird! Wenn ich ein '\\?\' vor dem Pfad stelle, erkennt Windows dass es ein UNC Path ist (Windows Plattform abhängig). UNC hat *nicht* die Einschränkung von MAX_Path und es wird auf die entsprechende Windows-API umgeleitet. Gut zu wissen... ... edt1.Text:= '\\?\' + 'c:\Lieder\$$$$$$_sdsfdsfdsfdsfdsfsd321fdsfdsf31ds f1dsf1ds3f1dsf1ds3f1ds31fds31f1dsf1dsf31dsf321ds1f ds31fds321f1dsf1dsf31ds32f1ds1f3ds1f3d2sf1ds32f1ds 3fds3f1ds3f1ds31fds1f312dsf312dsf31ds1fds31fds32f1 dsf1ds3f1ds3f12ds13fds132fsed\27 - Ieva Zasimauskaitė (Lithuania) - When We're Old.mp3' // das sind 285 Zeichen... … So funktioniert nun alles. Danke für die entsprechenden Hinweise auf MAX_PATH, weil ich nur nach TFileStream gesucht hatte! :dp: |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Naja super wenn es jetzt geht.
Aber die frage bleibt wie erstellst du den Pfad unter Windows ? Bei mir geht es nicht. gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Explorer meckert bei mir nicht beim erstellen aber ich würde dennoch über ShortName gehen.
Grund: Ich habe schlechte Erfahrung gemacht wenn man was Schreiben will, nur zum Lesen ists ok. |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Gebe ich den Namen hier kopiert bei mir so ein gibt's die Fehlermeldung wie im vorherigen Beitrag gezeigten Screeshot. Und bei Auführen wird alles abgeschnitten und dieser Fehler siehe shot. Hmmm.. hab wohl ein spezielles Window. Na egal wenn es läuft ;) Hat mich nur mal interessiert. Zitat:
gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Ausgangssituation war, das ein User mit meinem Programm seine Lieder nicht in mein Programm einlesen konnte. Es stellte sich dann heraus, dass seine Pfade länger 259 Zeichen waren. Die Ordner mit > 259 Zeichen hatte ich bei mir mit dem Total Commander erstellt. Aber auch mein Explorer erstellt Ordner > 260 Zeichen. (ich verwende das aktuelle Windows 10) Zitat:
Könnte also an der Windowsversion liegen (du nutzt ja Windows 7) :wink: |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Du willst c:\Lieder\$$$$$$_sdsfdsfdsfdsfdsfsd321fdsfdsf31ds f1dsf1ds3f1dsf1ds3f1ds31fds31f1dsf1dsf31dsf321ds1f ds31fds321f1dsf1dsf31ds32f1ds1f3ds1f3d2sf1ds32f1ds 3fds3f1ds3f1ds31fds1f312dsf312dsf31ds1fds31fds32f1 dsf1ds3f1ds3f12ds13fds132fsed erstellen und das kannst Du nicht. Lösung, kopiere diese Zeichenkette, öffne commandprompt und tippe md "c:\Lieder\$$$$$$_sdsfdsfdsfdsfdsfsd321fdsfdsf 31ds f1dsf1ds3f1dsf1ds3f1ds31fds31f1dsf1dsf31dsf321ds1f ds31fds321f1dsf1dsf31ds32f1ds1f3ds1f3d2sf1ds32f1ds 3fds3f1ds3f1ds31fds1f312dsf312dsf31ds1fds31fds32f1 dsf1ds3f1ds3f12ds13fds132fsed" ein und drücke Return, was passiert? Hurra wir haben ein tolles Verzeichnis erstellt ^_^ |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Zitat:
Was MakeDir ist, ist mir bekannt. gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Da wir beide Windows 7 haben und es so bei mir funktioniert, wieso nicht auch bei Dir?
|
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
md "c:\Lieder\$$$$$$_sdsfdsfdsfdsfdsfsd321fdsfdsf 31ds f1dsf1ds3f1dsf1ds3f1ds31fds31f1dsf1dsf31dsf321ds1f ds31fds321f1dsf1dsf31ds32f1ds1f3ds1f3d2sf1ds32f1ds 3fds3f1ds3f1ds31fds1f312dsf312dsf31ds1fds31fds32f1 dsf1ds3f1ds3f12ds13fds132fsed\27 - Ieva Zasimauskaite (Lithuania) - When We're Old.mp3" So! Und was sagt Window? Hurra der Pfad ist zu lang. Und was ich nicht schreiben kann, kann ich auch nicht lesen. (zumindest nicht auf Win7) OK ist egal.. gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Ja ok, ich habs ohne Dateinamen, nur Verzeichnis.
Bin Deiner Meinung, Egal :thumb: |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Und normalerweise gibt man den Dateinamen auch nicht mit an. Denn man will ja einen Folder erstellen. Wollte es aber destotrotz trotzdem mal versuchen ;) LOL gruss |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
"Leerzeichen" ... siehe "Zitat" des Posts ... das war das Forum (für erzwungenen Zeilenumbruch)
MAX_PATH = 260, inkl. Drive (C:\) und abschließender #0 = 256 für den "kompletten" Pfad Mehr als 260 nur via UNC. |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
@himitsu: ShortName ....
Delphi-Quellcode:
function GetShortPathString(sLongPathName : string) : string;
begin Result:=''; SetLength(Result,MAX_PATH+1); GetShortPathName(PChar(sLongPathName),PChar(Result),MAX_PATH); SetLength(Result,StrLen(PChar(Result))); end; |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Aber auch nur wenn das aktiv ist.
Standardmäßig generiert Windows/NTFS seit paar Jahren keine Kurznamen mehr (solange kein Programm explizit ANSI-File-APIs nutzt und da der lange Name nicht rein passt), wenn ich mich Recht erinner.
Delphi-Quellcode:
function GetShortPathString(const sLongPathName : string) : string;
begin SetLength(Result, MAX_PATH-1); // LongString im Delphi haben zwar eine Längenangabe, aber für einfache Casts auch implizit zwei #0 am Ende (der ShortString ein Längenbyte ohne #0) SetLength(Result, GetShortPathName(PChar(sLongPathName), PChar(Result), MAX_PATH)); // und man mag es nicht glauben, aber es soll WinAPIs geben, die haben ein Result, dass man nutzen kann end; |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Nette Umleitung:thumb:
Zitat:
|
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Hallo zusammen,
ich habe ein ähnliches Problem und die Angabe des UNC Namen hilft bei mir leider nicht. Diese Variante geht nicht (Fehlermeldung bei TFileStream.Create(OutputFileName))
Delphi-Quellcode:
Diese Variante geht (KEINE Fehlermeldung)
var
InputStream, OutputStream: TFileStream; InputFileName, OutputFileName: String; begin InputFileName := 'C:\Temp\Test.txt'; OutputFileName := '\\x.x.x.x\l\MeinOrdner\_Transfer\H_I_E_R_L_I_E_G_T_E_I_N_O_R_D_N_E_R\J_A_H_R\M_O_N_A_T\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N'; InputStream := TFileStream.Create(InputFileName, fmOpenRead); try OutputStream := TFileStream.Create(OutputFileName, fmCreate); try finally OutputStream.Free; end; finally InputStream.Free; end;
Delphi-Quellcode:
Wie bekomme ich es hin, dass die Max_Path Angabe nicht genommen wird?
var
InputStream, OutputStream: TFileStream; InputFileName, OutputFileName: String; begin InputFileName := 'C:\Temp\Test.txt'; OutputFileName := '\\x.x.x.x\l\MeinOrdner\_Transfer\H_I_E_R_L_I_E_G_T_E_I_N_O_R_D_N_E_R\J_A_H_R\M_O_N_A_T\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S'; InputStream := TFileStream.Create(InputFileName, fmOpenRead); try OutputStream := TFileStream.Create(OutputFileName, fmCreate); try finally OutputStream.Free; end; finally InputStream.Free; end; Habe Windows 10 64x |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Zitat:
Die LongPaths im Windows und Programm aktivieren und dann kann CreateFile/TFileStream/... eientlich auch mehr. ![]() ![]() Und beim Lesen von Pfaden nicht vergessen aufzupassen, dass ihr im Programm keine statischen Puffer mit MAX_PATH benutzt. Genau deswegen muß man es explizit aktivieren, weil Viele bei statschen Puffern gern vergessen die Rückgaben zu prüfen, weil kann konnte ja (früher) eh nicht mehr sein. Außerdem \\?\... oder \\?\UNC\server\share\... und nicht \\server\share\... :gruebel: |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Das muss doch auch anders gehen.
Im TotalCommander kann ich mit F7 auch direkt mehrere Ordner erzeugen in dem Eingabefeld, wenn ich eine Ordnertiefe > 260 Zeichen eingebe und da habe ich nichts im Windows umgestellt. In meiner Anwendung kann ich ja gerne irgendwas machen, damit es geht aber im Windows möchte ich nichts verstellen, weil die Anwendung auf x-Rechnern läuft und wie gesagt, der TotalCommander kann es doch auch ohne Windows Änderung. |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Hab es testhalber mal gemacht und die Funktion im Windows aktiviert:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\FileSystem\LongPathsEnabled Rechner neugestartet Geht immernoch nicht:
Delphi-Quellcode:
Geht auch nicht:
OutputFileName := '\\x.x.x.x\l\MeinOrdner\_Transfer\H_I_E_R_L_I_E_G_T_E_I_N_O_R_D_N_E_R\J_A_H_R\M_O_N_A_T\';
OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N';
Delphi-Quellcode:
Welchen Trick gibt es noch?
OutputFileName := '\\?\x.x.x.x\l\MeinOrdner\_Transfer\H_I_E_R_L_I_E_G_T_E_I_N_O_R_D_N_E_R\J_A_H_R\M_O_N_A_T\';
OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N\'; OutputFileName := OutputFileName + 'D_A_S_I_S_T_E_I_N_T_E_S_T_M_I_T_E_I_N_E_M_L_A_N_G_E_N_N_A_M_E_N'; |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Du solltest auch die letze Zeile von Hitsumi beachten.
Siehe ![]() Wir haben eine Funktion, die das automatische macht.
Delphi-Quellcode:
function LongFileName(AFileName: string): string;
var MaxPath: Word; begin Result := AFileName; MaxPath := Length(ExtractFilePath(AFileName)); // der Pfad darf nur 247 Zeichen lang sein // 12 Zeichen sind für den Dateinamen reserviert if (MaxPath >= MAX_PATH - 12) and (Copy(AFileName, 1, 4) <> '\\?\') then if Copy(AFileName, 1, 2) = '\\' then Insert('\?\UNC', Result, 2) else Result := '\\?\' + Result; end; |
AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Ok, da hatte ich die \\? Formatierung falsch verstanden.
Habe deine Funktion genommen aber ohne das "ExtractFilePath", der Pfad ist ja nicht das Problem, der Dateiname macht dann die Länge > 260 Zeichen. Geht jetzt. Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz