FileExists arbeitet fehlerhaft [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

FileExists arbeitet fehlerhaft [gelöst]

Beitrag von and4more »

Hallo liebes Forum,
bin auf ein irgendwie seltsames Problem gestoßen, was aber total lästig ist weil viele Kontrollen nicht klappen und zwar liefert mir FileExists nicht die korrekte Information, "FileUtils" sind in uses eingetragen :wink: Folgendes Beispiel:

Code: Alles auswählen

 
  if seldirdlg.Execute then     //Ordner für Pfad wird ausgewählt
    dbfPfad:=ExtractFilePath(seldirdlg.FileName);  //DB-Pfad extrahieren und aktualisieren
  ShowMessage('Pfad: '+dbfPfad);
  //Wenn im gewählten Verzeichnis eine BKP-Datei existiert...
  if FileExists(dbfPfad+'archiv.dbf') then begin   
    ShowMessage('Datenbankdatei: '+dbfPfad+'archiv.dbf');  //hier wird der korrekte Pfad+Datei angezeigt
    //...fragen, ob diese restauriert werden soll
    case MessageDlg('Datenbankdatei gefunden','Soll die vorhandene Datenbankdatei '+
    'überschrieben werden?',mtInformation,[mbYes,mbNo],0) of
      mrYes:    begin     //rekonstruieren
                  CopyFile(dbfPfad+'archiv.dbf',dbfPfad+'archiv.dbf.bkp');
                  CopyFile(dbfPfad+'archiv.mdx',dbfPfad+'archiv.mdx.bkp');
                  CreateDBF;    //Datenbank neu erstellen
                end;
      mrNo:       Abort;
    end;     //of case
  end else begin
    if FileExists(String(dbfPfad)+'archiv.dbf.bkp') then begin    //String(dbfPfad) versuchsweise probiert, klappt auch nicht
      //...fragen, ob diese restauriert werden soll
      case MessageDlg('Sicherungsdatei gefunden','Sicherungsdatei gefunden. '+
      'Soll diese rekonstruiert und verwendet werden?',mtInformation,
      [mbYes,mbNo],0) of
        mrYes: begin     //rekonstruieren
                 CopyFile(dbfPfad+'archiv.dbf.bkp',dbfPfad+'archiv.dbf');
                 CopyFile(dbfPfad+'archiv.mdx.bkp',dbfPfad+'archiv.mdx');
               end;
        mrNo:    FrmMain.CreateDBF;    //Datenbank neu erstellen
      end;   //of case
     //hier sollte CreateDBF stehen, würde mir aber zum aktuellen Zeitpunkt gnadenlos meine existierende Datenbank löschen
    end else ShowMessage('Weder "archiv.dbf" noch "archiv.dbf.bkp" gefunden');   
  end;
 


funktioniert nicht, bedeutet die CASE-Abfragen laufen immer durch bis ShowMessage. Hat jemand eine Erklärung? Oder braucht ihr noch weitere Informationen? Danke schon mal für's Kopf zerbrechen.
Zuletzt geändert von and4more am Mi 1. Feb 2017, 20:52, insgesamt 1-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: FileExists arbeitet fehlerhaft

Beitrag von wp_xyz »

Ich verstehe nicht, wo der Fehler auftritt - dein Code enthält FileExists an zwei Stellen.

Enthält dbfPfad Umlaute? --> Besser FileExistsUTF8 aus Unit LazFileUtils verwenden.
Hinten am dbfPfad hängt ein (Back-)Slash?

Generell zum Code:
Mit dem "if" in der 1.Zeile muss wahrscheinlich ein begin-end Block beginnen (if seldirdlg.Execute then begin...), denn ich vermute, dass der gezeigte Code nicht durchlaufen werden soll, wenn seldirdlg abgebrochen wurde (seldirdlg.Execute = false).

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: FileExists arbeitet fehlerhaft

Beitrag von and4more »

Die Abfrage über FileExists führt nicht zum Wert True, obwohl Pfad und Datei existieren. Der ShowMessage Abschnitt ist nur zur Überprüfung vorhanden. Der Pfad enthält Leerzeichen, keine Umlaute. FileExistsUTF8 ist als deprecated gekennzeichnet und in der Funktionsbeschreibung von FileExists steht als mögliche Angabe auch Unicode String. FileExists läuft 2x, weil auf unterschiedliche Dateien geprüft wird. Zuerst wählt der User einen Pfad, dann wird geprüft ob die Datenbankdatei dort existiert, wenn ja Nachfrage wie verfahren werden soll, wenn keine Datenbankdatei aber eine Sicherung existiert, ob aus der Sicherung die Daten rekonstruiert werden sollen.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: FileExists arbeitet fehlerhaft

Beitrag von and4more »

Nachtrag: die Funktion SelectOpenDirectory liefert bei ExtractFilePath immer den letzten Backslash mit, sodass der Dateiname unmittelbar drangehängt werden kann.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: FileExists arbeitet fehlerhaft

Beitrag von and4more »

Nachtrag: Wenn die SelectDirectory Abfrage abgebrochen wird, wird das Standardverzeichnis weiter verwendet. Wird schon vorher bei Initialisierung des Programms gesetzt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: FileExists arbeitet fehlerhaft

Beitrag von wp_xyz »

Hab gerade bei mir getestet: FileExists arbeitet korrekt auch wenn der Pfad ein Leerzeichen enthält.

Mit welchen Stringtypen arbeitest du? Doch hoffentlich nicht mit Widestring/Unicodestring? Unter Lazarus einfach nur: String.

Ich weiß nicht, was dein seldirdlg ist. Das eingebaute SelectDirectory gibt Verzeichnisnamen ohne Backslash zurück --> Verzeichnisnamen zur Sicherheit in AppendPathDelim setzen, so dass ggfs ein Backslash angehängt wird (if FileExists(AppendPathDelim(dbfPfad) + 'archiv.dbf')...)

Wenn du ExtractFilePath auf ein Verzeichnis anwendest, wird das letzte Unterverzeichnis entfernt. --> Schau dir die Verzeichnis/Pfadnamen GENAU an.

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: FileExists arbeitet fehlerhaft

Beitrag von and4more »

...hmmm, also bei mir wird die (String-)Variabe "dbfPfad" aus

Code: Alles auswählen

 
dbfPfad:=ExtractFilePath(seldirdlg.FileName);
 

erzeugt. ABER...
...beim genauen Betrachten (sehr guter Tipp!!!) der Meldung

Code: Alles auswählen

 
ShowMessage(dbfPfad+'archiv.dbf');
 

ist mir jetzt gerade aufgefallen, dass tatsächlich das letzte Verzeichnis ('DB') fehlt. Ohgottohgottohgott. Große Entschuldigung für das vertrottelte Post. Also immer besser 3x genau hinschauen. Somit...Problem gelöst! Vielen, vielen Dank.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Antworten