AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TFileStream crasht bei Dateiname=285 Zeichen mit Unicode
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

Ein Thema von juergen · begonnen am 27. Mai 2018 · letzter Beitrag vom 22. Sep 2022
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 28. Mai 2018, 12:46
@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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#22

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 28. Mai 2018, 12:51
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (28. Mai 2018 um 13:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 28. Mai 2018, 13:05
Nette Umleitung
Zitat:
If you call GetShortPathName on a path that doesn't have any short names on-disk, the call will succeed, but will return the long-name path instead. This outcome is also possible with NTFS volumes because there's no guarantee that a short name will exist for a given long name.
Von daher, Du hast Recht!
Gruß vom KodeZwerg

Geändert von KodeZwerg (28. Mai 2018 um 13:24 Uhr)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#24

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 10:29
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:
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;
Diese Variante geht (KEINE Fehlermeldung)
Delphi-Quellcode:
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;
Wie bekomme ich es hin, dass die Max_Path Angabe nicht genommen wird?
Habe Windows 10 64x
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#25

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 10:41
Zitat:
Wie bekomme ich es hin, dass die Max_Path Angabe nicht genommen wird?
Das machen, was in der Hilfe steht?

Die LongPaths im Windows und Programm aktivieren und dann kann CreateFile/TFileStream/... eientlich auch mehr.

https://learn.microsoft.com/de-de/wi...?tabs=registry
https://learn.microsoft.com/en-us/wi...?tabs=registry


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\...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Sep 2022 um 10:46 Uhr)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#26

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 10:46
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.
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#27

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 11:18
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:
  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';
Geht auch nicht:
Delphi-Quellcode:
  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';
Welchen Trick gibt es noch?
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#28

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 11:37
Du solltest auch die letze Zeile von Hitsumi beachten.
Siehe http://msdn.microsoft.com/en-us/libr...9.aspx#maxpath

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;
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#29

AW: TFileStream crasht bei Dateiname=285 Zeichen mit Unicode

  Alt 22. Sep 2022, 11:48
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz