Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi und schrottige/undurchdachte/chaotische File-APIs? (https://www.delphipraxis.net/195753-delphi-und-schrottige-undurchdachte-chaotische-file-apis.html)

himitsu 22. Mär 2018 10:51

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;

mkinzler 22. Mär 2018 10:58

AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
 
Die "neue" lehnt sich an .Net an.

günni0 22. Mär 2018 10:59

AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
 
Zitat:

Zitat von himitsu (Beitrag 1396974)
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:

Danke für den Hinweis. Habe eben sofort mal nach
Delphi-Quellcode:
TDirectory.Exists()
gesucht und sofort durch
Delphi-Quellcode:
System.SysUtils.DirectoryExists()
ersetzt.
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.

Daniel 22. Mär 2018 11:04

AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
 
Zitat:

Zitat von himitsu (Beitrag 1396974)
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.

Mit einem aktuellen Delphi lässt sich das nicht mehr nachstellen.

Der schöne Günther 22. Mär 2018 11:12

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.

Daniel 22. Mär 2018 11:12

AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
 
Wenn ich mal aus einem XE3 zitieren darf:

Delphi-Quellcode:
class function TDirectory.Exists(const Path: string; FollowLink: Boolean = True): Boolean;
begin
  Result := DirectoryExists(Path, FollowLink);
end;
TDirectory.Exists ist nicht mehr als ein Wrapper für die entsprechende Funktion aus der Unit SysUtils.
Ja, man kann sich natürlich auch gleich entrüsten etc. - aber vielleicht schaut man vorher kurz nach. :roll:

sh17 22. Mär 2018 11:49

AW: Delphi und schrottige/undurchdachte/chaotische File-APIs?
 
Zitat:

Zitat von Daniel (Beitrag 1396980)
Wenn ich mal aus einem XE3 zitieren darf:

Delphi-Quellcode:
class function TDirectory.Exists(const Path: string; FollowLink: Boolean = True): Boolean;
begin
  Result := DirectoryExists(Path, FollowLink);
end;
TDirectory.Exists ist nicht mehr als ein Wrapper für die entsprechende Funktion aus der Unit SysUtils.
Ja, man kann sich natürlich auch gleich entrüsten etc. - aber vielleicht schaut man vorher kurz nach. :roll:

"entrüst", anders herum hätte mehr Sinn gemacht. (geht aber sicher wegen Unitabhängigkeiten nicht)

himitsu 22. Mär 2018 11:58

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)

Stevie 22. Mär 2018 16:32

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 Cargo cult verbreiten :wall:

Ich tipp ja mal auf pebcak

himitsu 22. Mär 2018 16:47

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:
if TDirectory.Exists() or TFile.Exists()
sowieso störte und ein Blick in den Code von FileExists und DirectoryExists zeigten, dass es damit auch nur auf ein
Delphi-Quellcode:
if FileExists() or DirectoryExists()
hinaus liefe, hatte ich das einfach mal schnell durch ein
Delphi-Quellcode:
if GetFileAttributes() <> INVALID_FILE_ATTRIBUTES
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.
Seite 1 von 2  1 2      

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