Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verzeichnis auf Existenz prüfen? (https://www.delphipraxis.net/132951-verzeichnis-auf-existenz-pruefen.html)

AlexII 22. Apr 2009 16:07


Verzeichnis auf Existenz prüfen?
 
Hallo,

hab folgendes Problem: ich prüfe wie folgt auf Existenz einer Datei:

Delphi-Quellcode:
if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt') then
begin
ListBox1.Items.LoadFromFile(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt');
end else ListBox1.Items.LoadFromFile('ersatz.txt'); (hier wird die Datei aus dem Programmverzeichnis geladen)
der Code funktioniert soweit gut, aber nur! wenn das Verzeichnis "UserAppDataDir + AppDataRootDir + AppDataProjectDir" existieren. Wir das Programm das erste mal am PC gestartet gibt es auch logischerweise noch nicht, aber dann funkt auch mein Code nicht und beim Erststart wird die ersatz.txt nicht geladen.

Wie prüfe ich also auf Existenz eines Ordners bzw. Verzeichnisses?

Die Muhkuh 22. Apr 2009 16:08

Re: Verzeichnis auf Existenz prüfen?
 
Du könntest die Ordner mit ForceDirectories erstellen.

Ansonsten DirectoryExists.

shmia 22. Apr 2009 16:14

Re: Verzeichnis auf Existenz prüfen?
 
Und immer schön lokale Zwischenvariablen verwenden!!
Das hilft beim Debuggen und mancht den Code klarer und besser.
Delphi-Quellcode:
var
  filename : string;
begin
  filename := UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt';
  // sollte nun in filename ein Backslash fehlen oder zuviel sein, fällt das beim Debuggen sicher auf
  ...

himitsu 22. Apr 2009 16:18

Re: Verzeichnis auf Existenz prüfen?
 
Zitat:

(hier wird die Datei aus dem Programmverzeichnis geladen)
nein, diese wird nur rein zufällig aus dem Programmverzeichnis geladen.

AlexII 22. Apr 2009 16:22

Re: Verzeichnis auf Existenz prüfen?
 
Hab das jetzt so gelöst

Delphi-Quellcode:
if DirectoryExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir) then
begin
showmessage('Ja');
end else showmessage('Nein');
wenn das Verzeichnis existiert wird "Ja" angezeigt, wenn nicht kommt die Meldung "Nein" gar nicht, wer weiß wieso?

AlexII 22. Apr 2009 16:23

Re: Verzeichnis auf Existenz prüfen?
 
Zitat:

Zitat von himitsu
Zitat:

(hier wird die Datei aus dem Programmverzeichnis geladen)
nein, diese wird nur rein zufällig aus dem Programmverzeichnis geladen.

Wieso "rein zufällig"? :gruebel:

himitsu 22. Apr 2009 16:26

Re: Verzeichnis auf Existenz prüfen?
 
weil das aktuelle Vereichnis nicht unbedingt das Programmverzeichnis sein muß.

AlexII 22. Apr 2009 16:30

Re: Verzeichnis auf Existenz prüfen?
 
Zitat:

Zitat von himitsu
weil das aktuelle Vereichnis nicht unbedingt das Programmverzeichnis sein muß.

Und in welchen Fällen kann das kein Programmverzeichnis sein?

Wie komme ich dann an das Programmverzeichnis? Gibt' dafür ein Befehl oder muss man ne Funktion schreiben?

AlexII 22. Apr 2009 16:38

Re: Verzeichnis auf Existenz prüfen?
 
Hab schon gefunden

Delphi-Quellcode:
Path := ExtractFilePath(ParamStr(0));
aber wieso funkt der Code im Post #5 nicht das verstehe ich nicht. :gruebel:

DeddyH 22. Apr 2009 16:47

Re: Verzeichnis auf Existenz prüfen?
 
Und ich verstehe nicht, wieso Du Dir Dein Verzeichnis immer noch ständig neu zusammenbastelst. Ich hatte Dir doch erklärt, wie das mit Konstanten und privaten Feldern besser geht.

AlexII 22. Apr 2009 16:52

Re: Verzeichnis auf Existenz prüfen?
 
Zitat:

Zitat von DeddyH
Und ich verstehe nicht, wieso Du Dir Dein Verzeichnis immer noch ständig neu zusammenbastelst. Ich hatte Dir doch erklärt, wie das mit Konstanten und privaten Feldern besser geht.

Ja das werde ich ändern, ist kein Problem, das Problem ist wieso die Fehlermeldung nicht kommt, wenn das Verzeichnis nicht existiert. :gruebel:

DeddyH 22. Apr 2009 16:57

Re: Verzeichnis auf Existenz prüfen?
 
Der Code ist aber eigentlich in Ordnung. Steht da vielleicht noch was anderes dazwischen?

AlexII 22. Apr 2009 17:01

Re: Verzeichnis auf Existenz prüfen?
 
Ne nix dazwischen, eins zu eins kopiert.

Das wird im Ereignis TForm1.FormShow aufgerufen, vllt liegt hier der Fehler? :gruebel:

DeddyH 22. Apr 2009 17:04

Re: Verzeichnis auf Existenz prüfen?
 
Daran kann es nicht liegen. Zeig mal den ganzen Code vom FormShow.

AlexII 22. Apr 2009 17:12

Re: Verzeichnis auf Existenz prüfen?
 
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var update: Integer;
    Ini  : TIniFile;
    UserAppDataDir, ProgPath: String;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config.ini') then
  begin
    Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config.ini');
  try
    ComboBox1.ItemIndex := Ini.ReadInteger('Default', 'Channel', 1);
  finally
    ini.free;
  end;

if DirectoryExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir) then
begin
showmessage('Ja');
end else showmessage('Nein');

ProgPath := ExtractFilePath(ParamStr(0));

if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt') then
begin
ListBox1.Items.LoadFromFile(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt');
end else ListBox1.Items.LoadFromFile(ProgPath + 'ersatz.txt');
end;
PS. Das mit deinem Vorschlag werde ich noch umsetzen.

DeddyH 22. Apr 2009 17:15

Re: Verzeichnis auf Existenz prüfen?
 
Hab ich mich verzählt oder fehlt da ein "end;"?

AlexII 22. Apr 2009 17:18

Re: Verzeichnis auf Existenz prüfen?
 
Hab wahrscheinlich nicht mitkopiert, aber das Programm läuft, also es fehlt nichts. Wie gesagt "Ja" wird ausgegeben, dann lösche ich den Ordner "AppDataProjectDir" und die Meldung "Nein" springt nicht auf.

DeddyH 22. Apr 2009 17:21

Re: Verzeichnis auf Existenz prüfen?
 
Natürlich nicht, da als erste Bedingung geprüft wird, ob die Ini existiert. Kann sie aber nicht, wenn es das Verzeichnis gar nicht gibt. Wenn Du vernünftig einrücken würdest, hättest Du das wahrscheinlich auch gesehen ;)

AlexII 22. Apr 2009 17:24

Re: Verzeichnis auf Existenz prüfen?
 
Ja und was hat das damit zutun, ja die ini existiert nicht, aber danach wird ja wieder nach nem anderem Verzeichnis gefragt. :gruebel: Verstehe ich nicht.

AlexII 22. Apr 2009 17:26

Re: Verzeichnis auf Existenz prüfen?
 
Aaaaaa jetzt verstehe ich, der Ordner wird ja für ini erstellt, genau. :dancer2:

DeddyH 22. Apr 2009 17:28

Re: Verzeichnis auf Existenz prüfen?
 
Trotzdem habe ich Deinen Code mal neu formatiert:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var update: Integer;
    Ini  : TIniFile;
    UserAppDataDir, ProgPath: String;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config.ini') then
    //dieser Block wird niemals ausgeführt, wenn die Ini nicht existiert
    begin
      Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config.ini');
      try
        ComboBox1.ItemIndex := Ini.ReadInteger('Default', 'Channel', 1);
      finally
        ini.free;
      end;

      if DirectoryExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir) then
        begin
          showmessage('Ja');
        end
      else
        showmessage('Nein');

      ProgPath := ExtractFilePath(ParamStr(0));

      if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt') then
        begin
          ListBox1.Items.LoadFromFile(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\original.txt');
        end
      else
        ListBox1.Items.LoadFromFile(ProgPath + 'ersatz.txt');
    end;
end;
Bei nachvollziehbarer Einrückung sieht man das sofort :zwinker:

AlexII 22. Apr 2009 17:32

Re: Verzeichnis auf Existenz prüfen?
 
Hab das Programm noch mal gestartet, ohne Code zu ändern, und es wird auf einmal nix erstellt, nicht die ini und nicht der Ordner, jetzt verstehe ich garnix. :wall:

Aber danke dir, ich gucke mal jetzt weiter.

AlexII 22. Apr 2009 17:37

Re: Verzeichnis auf Existenz prüfen?
 
Hab die Geschichte mit der .ini am Ende der procedure gesetzt und jetzt funkt alles, aber wirklich alles. :dancer2:

Thx noch mal. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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