![]() |
Delphi-Version: XE
Delphi und schrottige/undurchdachte/chaotische File-APIs?
Also erstmal bin ich über gegensätzliche APIs der SysUtils und IOUtils gestolpert.
Ich finde es bissl Krank, dass die "alte" und "neue" API komplett entgegen arbeiten und keiner von Beiden bei GetExt und ChangeExt jeweils gleich arbeiten. > Mal inkl. Punkt und mal exclusive und die andere API andersrum Vorhin stolperte ich über eine Endloschschleife im Debugger, denn TDirectory.Exists(Result) liefert dort immer True, auch wenn keine Datei/Verzeichnis mit diesem Namen existiert. :wall: Und warum kann man nicht einfach fragen "Existiert" irgendwas? FileExists liefert False, wenn ein Verzeichnis existiert und DirExists bei einer Datei. Hier eine kleine und inzwischen gebugfixte Beispiel-Funktion, wo ich die Fails als Doku dringelassen hab.
Delphi-Quellcode:
function CreateUnusedFileName(Filename: string): string;
var Count: Integer; begin Result := Filename; Count := 1; //while TFile.Exists(Result) or TDirectory.Exists(Result) do begin // TDirectory.Exists liefert im Debugger immer True, egal ob was existiert oder nicht while GetFileAttributes(PChar(Result)) <> INVALID_FILE_ATTRIBUTES do begin // and not (GetLastError in [ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND, ERROR_INVALID_NAME]) Inc(Count); { TPath.ChangeExtension mit Punkt ChangeFileExt ohne Punkt TPath.GetExtension ohne Punkt ExtractFileExt mit Punkt } //Result := TPath.ChangeExtension(Filename, '') + Format('~%d', [Count]) + TPath.GetExtension(Filename); Result := ChangeFileExt(Filename, '') + Format('~%d', [Count]) + ExtractFileExt(Filename); end; end; |
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Die "neue" lehnt sich an .Net an.
|
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Zitat:
Delphi-Quellcode:
gesucht und sofort durch
TDirectory.Exists()
Delphi-Quellcode:
ersetzt.
System.SysUtils.DirectoryExists()
Ich finde es aber auch ein wenig gewöhnungsbedürftig, dass Funktionen für ein und denselben Zweck in mehreren Units zu finden sind. Ich kann nicht in die Units reingucken, aber ich spreche von meinem Beispiel oben. TDirectory.Exists() und dann nochmal DirectoryExists() in System.SysUtils. Ich verwende weiterhin lieber System.SysUtils. Denn wenn ein Verzeichnis nicht existiert, gibt TDirectory.Exists() wie du sagtest trotzdem True zurück was meiner Meinung nach Blödsinn ist. |
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Zitat:
|
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Schreckensmeldung. Mir fehlt aber jetzt auch ein bisschen etwas womit ich das nachstellen könnte. Input und erwarteter Output. Vielleicht ist die Lösung ja ganz einfach.
|
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Wenn ich mal aus einem XE3 zitieren darf:
Delphi-Quellcode:
TDirectory.Exists ist nicht mehr als ein Wrapper für die entsprechende Funktion aus der Unit SysUtils.
class function TDirectory.Exists(const Path: string; FollowLink: Boolean = True): Boolean;
begin Result := DirectoryExists(Path, FollowLink); end; Ja, man kann sich natürlich auch gleich entrüsten etc. - aber vielleicht schaut man vorher kurz nach. :roll: |
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Zitat:
|
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Das mit dem unterschiedliechen Verhalten zwischen SysUtils und IOUtils, betrifft vor allem die Funktionen zum Zerlegen von Pfaden. (Drive/Path/Dir/Name/Ext)
Warum das DirectoryExists True liefert, nur im Debugger, hab ich noch nicht untersucht. Bin an 'nem anderen Fehler dran und brauchte eine schnelle Lösung, für das hier. System: Server 20016 R2 (relativ frisch installiert), Delphi XE (noch), IDEFixPack, DDevExtensions, GExperts, CnPack (bei mir Beides zu großen Teilen deaktiviert, weil nervig), DevExpress, Devart PgDAC, FireDAC, DocuInsightPro, Eurekalog, FastReport, TChartPro, ImageEn usw. AQTime Pro, aber nicht in der IDE installiert und auch das Vorinstalliere aus der IDE rausgeworfen, weil es ständig Probleme macht. (obwohl es nicht verwendet wird, findet man es innerhalb der IDE überall im Stacktrace, welcher auch manchmal dort abbricht) |
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
Bli bla blubb, TDirectory.Exists ist sogar mit inline markiert, d.h. es kommt exakt derselbe Binärcode heraus, egal ob nun SysUtils.DirectoryExists oder TDirectory.Exists aufgerufen wird.
Aber einfach mal bisschen ![]() Ich tipp ja mal auf ![]() |
AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
"Ich" hatte nie gesagt, dass TDirectory.Exists und DirectoryExists sich unterscheiden. :zwinker:
TPath.ChangeExtension und ChangeFileExt TPath.GetExtension und ExtractFileExt tuen das aber definitiv Im Debugger war mir nur leider aufgefallen, dass TDirectory.Exists immer True lieferte, obwohl weder Datei noch Verzeichnis mit diesem Namen existierten. (ergab eine schöne Entlosschleife) Und weil mich diese sinnlos doppelt Abfrage ala
Delphi-Quellcode:
sowieso störte und ein Blick in den Code von FileExists und DirectoryExists zeigten, dass es damit auch nur auf ein
if TDirectory.Exists() or TFile.Exists()
Delphi-Quellcode:
hinaus liefe, hatte ich das einfach mal schnell durch ein
if FileExists() or DirectoryExists()
Delphi-Quellcode:
ersetzt und nicht weiter drüber nachgedacht, weil das Problem nun weg war. Dabei war mir nur wieder einmal die Kommentierung bezüglich TPath.ChangeExtension aufgefallen und es hat mich angekotzt, dass schon mehrmals unnötig viel Zeit dafür drauf ging.
if GetFileAttributes() <> INVALID_FILE_ATTRIBUTES
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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