FileExists arbeitet fehlerhaft [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...

FileExists arbeitet fehlerhaft [gelöst]

Beitragvon and4more » 31. Jan 2017, 23:14 FileExists arbeitet fehlerhaft [gelöst]

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 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
and4more
 
Beiträge: 194
Registriert: 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
Nach oben

Beitragvon wp_xyz » 31. Jan 2017, 23:39 Re: FileExists arbeitet fehlerhaft

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).
wp_xyz
 
Beiträge: 1878
Registriert: 8. Apr 2011, 08:01

Beitragvon and4more » 1. Feb 2017, 00:55 Re: FileExists arbeitet fehlerhaft

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: 194
Registriert: 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
Nach oben

Beitragvon and4more » 1. Feb 2017, 00:59 Re: FileExists arbeitet fehlerhaft

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: 194
Registriert: 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
Nach oben

Beitragvon and4more » 1. Feb 2017, 01:06 Re: FileExists arbeitet fehlerhaft

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
and4more
 
Beiträge: 194
Registriert: 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
Nach oben

Beitragvon wp_xyz » 1. Feb 2017, 09:27 Re: FileExists arbeitet fehlerhaft

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.
wp_xyz
 
Beiträge: 1878
Registriert: 8. Apr 2011, 08:01

Beitragvon and4more » 1. Feb 2017, 20:52 Re: FileExists arbeitet fehlerhaft

...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
and4more
 
Beiträge: 194
Registriert: 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
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

cron
porpoises-institution
accuracy-worried