Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Herausfinden ob eine Datei existiert (https://www.delphipraxis.net/211495-herausfinden-ob-eine-datei-existiert.html)

JimmyB 23. Sep 2022 13:20

Herausfinden ob eine Datei existiert
 
Hallo allerseits,

ich habe gerade ein Brett vor dem Kopf. Bei der Abfrage, ob eine Datei existiert, bekomme ich immer die Rückmeldung dass diese eben nicht da ist.
Im Beispiel ist es die Datei 'Fragen.txt', die definitiv da ist.
Es wird immer die showmessage Nachricht ausgegeben, was eigentlich nicht der Fall sein dürfte, weil die Datei ja existiert.

1. Versuch:
if FileExists ( 'C:\Users\leo-jschm\Documents\Delphi Programme\QA\QA_v1\Fragen.txt' ) = False then
begin
showmessage ('Die Datei mit den Fragen kann nicht gefunden werden!');
Exit;
end;


2. Versuch mit Variation:
if FileExists ( 'C:\Users\leo-jschm\Documents\Delphi Programme\QA\QA_v1\Fragen.txt' ) = False then
begin
showmessage ('Die Datei mit den Fragen kann nicht gefunden werden!');
Exit;
end;

VG JimmyB

Rolf Frei 23. Sep 2022 13:34

AW: Ich glaube die Frage ist einfach aber.....
 
FileExist liefert dir bereits einen Boolean, daher ist die doppelte Boolean mit False unnötig. Schreib so Sachen, die einen Boolean liefern besser so:
Delphi-Quellcode:
if not FileExists ( 'C:\Users\leo-jschm\Documents\Delphi Programme\QA\QA_v1\Fragen.txt' ) then
begin
showmessage ('Die Datei mit den Fragen kann nicht gefunden werden!');
Exit;
end;
Das ändert aber nichts an deinem Problem. Versuche mal die Datei in eine TStringList zu laden (StringList.LoadFromFile(xy)). Da müsstest du eigentlich einen Fehler erhalten, denn ich vermute, dass dein Programm keinen Zugriff auf diese Datei hat. Was passiert denn, wenn du mal im CMD (Eingabeaufforderung) notepad "C:\Users\leo-jschm\Documents\Delphi Programme\QA\QA_v1\Fragen.txt" eingibst? Wird das ohne Problem geladen oder bekommst du da einen Fehler?

himitsu 23. Sep 2022 13:53

AW: Ich glaube die Frage ist einfach aber.....
 
Wenn so einfach, warum sagt dann der "Titel" nichts darüber aus, worum es hier geht?

Was ist der Unterschied zwischen Variante 1 und 2? (ich seh irgendwie nichts)

Und wenn du
Delphi-Quellcode:
C:\Users\leo-jschm\Documents\Delphi Programme\QA\QA_v1\Fragen.txt
in das obere Edit des Explorers kopierst und [Enter] drückst, dann geht die Datei auf?

[add]
Zugriff auf die Datei ist egal, aber kein Lesezugriff auf das Verzeichnis ... ja, das könnte sein.

KodeZwerg 23. Sep 2022 14:00

AW: Ich glaube die Frage ist einfach aber.....
 
Alternativ mal mit einem OpenFileDialog an die Sache rangehen. Vielleicht ist ja wie Rolf schon schrieb keine Berechtigung vorhanden oder Du hast einen Tippfehler in deinem Hardcodet string drinn.

Daniel 23. Sep 2022 14:18

AW: Herausfinden ob eine Datei existiert
 
// ich habe mal den Titel der Frage angepasst.

DeddyH 23. Sep 2022 14:45

AW: Herausfinden ob eine Datei existiert
 
Dann hättest Du aber auch gleich noch die Delphi-Tags einfügen können :mrgreen:

JimmyB 23. Sep 2022 18:45

AW: Herausfinden ob eine Datei existiert
 
Hallo allerseits,

vielen Dank für die vielen Tipps. Ich habe die Textdatei ins gleiche Verzeichnis kopiert, wie die Projektdatei liegt, bzw. die .exe Datei und siehe es funktioniert.
Der Zugriff auf andere Verzeichnisse war in der Tat ein Rechteproblem.

vg JimmyB

BMI 23. Sep 2022 23:42

AW: Ich glaube die Frage ist einfach aber.....
 
Zitat:

Zitat von KodeZwerg (Beitrag 1512345)
Alternativ mal mit einem OpenFileDialog an die Sache rangehen. Vielleicht ist ja wie Rolf schon schrieb keine Berechtigung vorhanden oder Du hast einen Tippfehler in deinem Hardcodet string drinn.

ja, find ich ansich gut.

ganz generell ..
OpenFileDialog ... und ähnliche Dialoge:
(nur mal noch so als persönliche Bemerkung:)
Also den Nutzer bei der Pfadsuche unterstützend finde ich ja gut.
Daß sie auch dem Programmierer ermöglichen den korrekten Pfad zu ermitteln und sicherzustellen, daß der Pfad auch konform angegeben wurde (kein 'C;\' oder 'C:\\Dokumente\' oder "C:\Dokumente", wenn man als Programmierer später zum Speichern an 'C:\Dokumente' noch 'Datei1.txt' für 'C:\Dokumente\Datei1.txt' dranhängen möchte.
Wenn man sich als Nutzer aber durch einen Pfad zum richigen Ordner 'C:\Dokumente\Nutzer\Karl\privat\Chor3\Vorstand\in terna\Kassenwart\Planung\2022\September\22\Abends\ Fahrt\Busreise\Vorkasse\' als Tree 16x klicken muß, statt einfach den Pfad per copy&paste direkt eingeben kann, (falls man den zur Hand hat), nur weil der Programmierer den Pfad nicht auf Fehler ('C:\pfad'+'datei.txt', 'C:\\da' s.o.) checken möchte ist das manchmal für den Anwender eine Tortur, v.a. wenn das Programm des Mal beim Speichern oder Laden wieder den Dialog bei 'C:\' beginnen läßt ...
Keepass, xmediaRecode und noch einige andere machen das so. Und man hat keine Möglichkeit jedes Mal den langen Pfad aus der Zwischenablage einzugeben ...

Man sollte auch an den Nutzer denken, der evtl. auch erfahrener ist und
ggf. mehrmals Pfade zum Speichern eingeben zum schnelleren Navigieren möchte und das Laden und Speichern ggf. freundlicher gestalten.
oder per Ini Pfade editierbar vorgeben können.

nur mal so nebenbei ... LG

himitsu 24. Sep 2022 05:15

AW: Herausfinden ob eine Datei existiert
 
Delphi-Quellcode:
DragAcceptFiles(Self.Handle, True); // mit WM_DROPFILES (oder nur an Edit/Panel)
SHAutoComplete(FilenameEdit.Handle, SHACF_FILESYSTEM or SHACF_FILESYS_ONLY or SHACF_FILESYS_DIRS
  or SHACF_AUTOSUGGEST_FORCE_ON or SHACF_AUTOAPPEND_FORCE_ON);
und zusätzlich noch einen Button/Doppelklick mit dem TFileOpenDialog

MSDN-Library durchsuchenSHAutoComplete

JimmyB 24. Sep 2022 15:28

AW: Herausfinden ob eine Datei existiert
 
Hallo allerseits,
mir ist noch aufgefallen, dass diese Textdatei, die mein Programm nicht finden konnte, unter "Pfad zum Delphi Programm\Win32\debug" stehen muss.
Die Pfadangabe von mir, die ich im Code platziert habe, interessiert das Delphi Programm nicht die Bohne.
Sehr seltsam!

Wie dem auch sei, die Werte werden jetzt eingelesen und in einem Richtext Objekt zur Anzeige gebracht.
Jetzt ist der Plan aber das jede einzelen Zeile für sich in einem
----Checkbox1
----Checkbox2
----Checkbox3

zur Anzeige gebracht wird.
Ich habe dazu Versuche mit einem Label Objekt und einem Checkbox Objekt gemacht
Ich dachte für CheckBox1 wird nur die erste Zeile angezeigt.
Ist aber nicht so, weil die Schleife die Textdatei durchgeht und die letzte Zeile aus der Textdatei, im Caption des Objekts zur Anzeige bringt.
Mit einer Schleife, welche die Checkbox1, Checkbox2, Checkbox3 usw durchgeht, wäre eine Variable

- Checkboxi.Caption (i soll hier die laufende Nummer als Variable genutzt werden

ggf. ein Weg. Ich scheitere gerade an der Schleife, oder den Variabletypen.



vg JimmyB

blawen 24. Sep 2022 15:59

AW: Herausfinden ob eine Datei existiert
 
Zitat:

Zitat von JimmyB (Beitrag 1512372)
mir ist noch aufgefallen, dass diese Textdatei, die mein Programm nicht finden konnte, unter "Pfad zum Delphi Programm\Win32\debug" stehen muss.
Die Pfadangabe von mir, die ich im Code platziert habe, interessiert das Delphi Programm nicht die Bohne.

Die .exe liegt im Normalfall im \Win32(64)\Release(Debug) Verzeichnis... und wenn Du sie dorthin kopiert hast, wirst Du sie ja auch dort finden. ;-)
Zitat:

Ich habe die Textdatei ins gleiche Verzeichnis kopiert, wie die Projektdatei liegt, bzw. die .exe Datei und siehe es funktioniert.
Vom Beschrieb her klingt es, als ob Du z.B.
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
verwendest.

Wie sieht den der aktuelle Code aus?

THY4243 24. Sep 2022 16:50

AW: Herausfinden ob eine Datei existiert
 
Zitat:

Zitat von blawen (Beitrag 1512373)
Vom Beschrieb her klingt es, als ob Du z.B.
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
verwendest.

Wie sieht den der aktuelle Code aus?

... Dann wäre es sicher einfacher, zu helfen. Auch, weil es ggf. ein Thema "Windows 32Bit-Application läuft auf 64-Bit-Windows" sein kann.

JimmyB 24. Sep 2022 17:48

AW: Herausfinden ob eine Datei existiert
 
Hallo,

der Code, der so nicht funktioniert:
var i : Integer;
i:=1;
for i := 1 to 10 do begin
checkbox+inttostr(i).Caption := sLine;

Mit diesem Konstrukt funktioniert es auf jeden Fall nicht.

Ich einen Reihe von Checkboxen angelegt und in den "Captions" möchte ich jeweils eine Zeile aus der Textdatei anzeigen.
Anders geschrieben, im Grunde ist es egal, in welchem Objekt ich die Zeilen jeweils anzeige. Wichtig ist, dass jede Zeile in einem eigenen Objekt (also nicht in einem Richtext Objekt gezeigt wird.
Der Plan ist das ich Checkbox1, Checkbox2 und so weiter, der Reihe nach hochzähle und dann jeweils in die Textzeile dort anzeige.

vg JimmyB

JimmyB 24. Sep 2022 17:50

AW: Herausfinden ob eine Datei existiert
 
Hallo,

der Code, der so nicht funktioniert:


while NOT eof (myfile) do
begin
//Step 6: Get each line of text file into string variable
readln (myfile, sLine);

// work with sLine

var i : Integer;
i:=1;
for i := 1 to 10 do begin
checkbox+inttostr(i).Caption := sLine;

Mit diesem Konstrukt funktioniert es auf jeden Fall nicht.

Ich einen Reihe von Checkboxen angelegt und in den "Captions" möchte ich jeweils eine Zeile aus der Textdatei anzeigen.
Anders geschrieben, im Grunde ist es egal, in welchem Objekt ich die Zeilen jeweils anzeige. Wichtig ist, dass jede Zeile in einem eigenen Objekt (also nicht in einem Richtext Objekt gezeigt wird.
Der Plan ist das ich Checkbox1, Checkbox2 und so weiter, der Reihe nach hochzähle und dann jeweils in die Textzeile dort anzeige.

vg JimmyB

KodeZwerg 24. Sep 2022 18:17

AW: Herausfinden ob eine Datei existiert
 
Ich habe mal spaßenshalber 2 checkboxen auf eine form geknallt und folgendes erfolgreich ausprobiert, damit solltest du voran kommen wenn du meiner logik folgen kannst:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Component: TComponent;
begin
  for I := 1 to 2 do
    begin
      Component := FindComponent('CheckBox' + IntToStr(I));
      if ((Component <> nil) and (Component is TCheckBox)) then
        TCheckBox(Component).Caption := 'Text ' + IntToStr(I);
    end;
end;
Viel Spass damit!

blawen 24. Sep 2022 18:46

AW: Herausfinden ob eine Datei existiert
 
Eine andere Variante mit 3 bereits vorhandenen Checkboxen, einem OpenDialog, einem Memo als visuelle Kontrolle für den Textinhalt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sListe  : TStringList;
  iZaehler : Integer;

begin
  if OpenDialog1.Execute
  then begin
    if FileExists(OpenDialog1.FileName)
    then begin
      sListe := TStringList.Create;
      sListe.LoadFromFile(OpenDialog1.FileName);

      // Ausgabe im Memo
      iZaehler := 1;
      repeat
        memo1.Lines.Add(sListe[iZaehler - 1]);
        inc(iZaehler);
      until iZaehler > sListe.Count;

      // Ausgabe via Checkbox
      iZaehler := 1;
      repeat
        TCheckBox(FindComponent('Checkbox' + IntToStr(iZaehler))).Caption := sListe[iZaehler - 1];
        inc(iZaehler);
      until iZaehler > sListe.Count;
    end
    else raise Exception.Create('Die Datei existiert nicht.');
  end;
end;
Um das ganze (Datei-) Handling zu vereinfachen, setze ich eine eine TStringList ein.
Allerdings beginnt deren Index bei Null, daher auch
Delphi-Quellcode:
sListe[iZaehler - 1];

KodeZwerg 24. Sep 2022 18:55

AW: Herausfinden ob eine Datei existiert
 
hab mal was gekürzt :)
Zitat:

Zitat von blawen (Beitrag 1512385)
Delphi-Quellcode:
  if ((OpenDialog1.Execute) and (FileExists(OpenDialog1.FileName))) then
    begin

Geht bestimmt noch kürzer (FileMustExist) :D

blawen 24. Sep 2022 20:20

AW: Herausfinden ob eine Datei existiert
 
Zitat:

Zitat von KodeZwerg (Beitrag 1512386)
hab mal was gekürzt :)
Zitat:

Zitat von blawen (Beitrag 1512385)
Delphi-Quellcode:
  if ((OpenDialog1.Execute) and (FileExists(OpenDialog1.FileName))) then
    begin

Geht bestimmt noch kürzer (FileMustExist) :D

und auch "richtiger" - die Stringliste sollte auch wieder freigegeben werden ;-)
FileExists müsste vermutlich nicht eingesetzt werden, da eigentlich nur eine existierende Datei per OpenDialog ausgewählt werden kann.
Aber wenn JimmyB die Datei direkt aufrufen möchte, ist es zu empfehlen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sListe  : TStringList;
  iZaehler : Integer;

begin
  if     (OpenDialog1.Execute)
      and (FileExists(OpenDialog1.FileName))
  then begin
    sListe := TStringList.Create;
    try
      sListe.LoadFromFile(OpenDialog1.FileName);

      iZaehler := 1;
      repeat
        TCheckBox(FindComponent('Checkbox' + IntToStr(iZaehler))).Caption := sListe[iZaehler - 1];
        inc(iZaehler);
      until iZaehler > sListe.Count;
    finally
      sListe.Free;
    end;
  end;
end;

himitsu 24. Sep 2022 20:42

AW: Herausfinden ob eine Datei existiert
 
Warum Repeat mit Variablelenrumgefummel und nicht einfach ein For, wo die Anzahl doch feststeht?

Und wer in die Options schaut, wird erkennen, dass man den Dialog so einstellen kann dass er nur existierende Dateien zurückgibt.

HolgerX 25. Sep 2022 08:40

AW: Herausfinden ob eine Datei existiert
 
Hmm...

Zitat:

Zitat von blawen (Beitrag 1512391)
Zitat:

Zitat von KodeZwerg (Beitrag 1512386)
hab mal was gekürzt :)

Geht bestimmt noch kürzer (FileMustExist) :D

und auch "richtiger" - die Stringliste sollte auch wieder freigegeben werden ;-)
FileExists müsste vermutlich nicht eingesetzt werden, da eigentlich nur eine existierende Datei per OpenDialog ausgewählt werden kann.

Zum Einen hat der OpenDialog (zu mindestens in D6) ein Option 'ofFileMustExist'...
Zum Anderen 'ofAllowMultiSelect' wodurch mehr wie eine Datei ausgewählt werden kann und dann über OpenDialog1.Files aufgelistet werden.

Dennis07 26. Sep 2022 11:45

AW: Herausfinden ob eine Datei existiert
 
Grundsätzlich muss man auch beachten, dass FilExists leider unter Windows mglw. nicht korrekt True bzw. False, sondern 1 -1 bzw. 0 zurückliefert. Das hatte ich auch schonmal, deshalb am besten "not FileExists(...)" anstelle von "FileExists(...) = False" verwenden.

himitsu 26. Sep 2022 12:16

AW: Herausfinden ob eine Datei existiert
 
Gut, =False wird immer funktionieren, da es nur EIN False gibt,
aber =True fängt schon damit an, dass es -1, 1 oder bis zu 2 Milliarden andere Werte sein kann, aber die Konstante "True" nur einen Wert davon hat (im Delphi Boolean = 1 Byte ... im C++ oft 4 Byte signed oder auch ein 1 BYTE oder 1 SHORT oder 2 Byte oder ...)

also besser garnicht erst machen




Hier ist aber das Problem, dass "kann auf Verzeichnis nicht zugreifen und somit keine Dateien finden" auch als "existiert nicht" angesehn wird.
Es gibt halt nur JA und NEIN, aber kein VIELLEICHT.

Dafür könnte man entweder im FileExist eine Exception werfen, wenn es "Fehler" gibt, aber dieses Verhalten wäre jetzt nicht so toll, wenn es plötzlich knallen könnte,
also eine neue Funktionen ala "FileAccessCheck", welche z.B. einen Enum zurück gibt, mit Existiert, ExistiertReadOnly, ExistiertAberWederLeseNochSchreibzugriff ZugriffVerweigert, DateiExistiertNicht, VerzeichnisExistiertNicht, PfadUngültig, VielleichtNochwasDasMirGradeNichtEinfällt


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