AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi und schrottige/undurchdachte/chaotische File-APIs?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi und schrottige/undurchdachte/chaotische File-APIs?

Ein Thema von himitsu · begonnen am 22. Mär 2018 · letzter Beitrag vom 23. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

Delphi und schrottige/undurchdachte/chaotische File-APIs?

  Alt 22. Mär 2018, 11:51
Delphi-Version: XE
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.

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;
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 22. Mär 2018, 11:58
Die "neue" lehnt sich an .Net an.
Markus Kinzler
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#3

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

  Alt 22. Mär 2018, 11:59
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.
Danke für den Hinweis. Habe eben sofort mal nach TDirectory.Exists() gesucht und sofort durch 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.

Geändert von günni0 (22. Mär 2018 um 12:03 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 22. Mär 2018, 12:04
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 22. Mär 2018, 12:12
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.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 22. Mär 2018, 12:12
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.664 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 22. Mär 2018, 12:49
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.
"entrüst", anders herum hätte mehr Sinn gemacht. (geht aber sicher wegen Unitabhängigkeiten nicht)
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 22. Mär 2018, 12:58
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)
$2B or not $2B

Geändert von himitsu (22. Mär 2018 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

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

  Alt 22. Mär 2018, 17:32
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

Ich tipp ja mal auf pebcak
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (22. Mär 2018 um 17:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 22. Mär 2018, 17:47
"Ich" hatte nie gesagt, dass TDirectory.Exists und DirectoryExists sich unterscheiden.

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 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 if FileExists() or DirectoryExists() hinaus liefe, hatte ich das einfach mal schnell durch ein 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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:12 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