Thema: Delphi ForceFile

Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#9

AW: ForceFile

  Alt 24. Jul 2022, 11:52
*1) Einzig um beim Laden bereits zu prüfen, ob die Datei später auch gespeichert werden kann,
aber auch a kann man direkt mir einem Read/Write-Schreibzugriff die Datei öffnen (ohne ihren Inhalt zu löschen) und direkt laden.
Mir ging's darum, am Anfang zu prüfen, ob die Datei nicht nur geladen werden kann (sofern vorhanden), sondern auch am Anfang schon (möglichst) sicherzustellen, dass sie im späteren Programmverlauf auch geschrieben werden kann.

Bei 'ner Logdatei ist's halt "blöde", wenn nach stundenlangem Programmlauf festgestellt wird, dass die Logdatei nicht geschrieben werden kann. Ist halt ärgerlich, kommt aber zuweilen schonmal im realen Leben vor.

Daher mach' ich lieber ein paar Prüfungen zuviel, als irgendwann auf die Nase zu fallen.

Wenn das ForceDirectories bereits am Anfang scheitert, weiß man, dass man nicht sinnvoll weitermachen kann, auch wenn das ForceDirectories letztlich unmittelbar vor dem SaveToFile ausreichen würde.

Natürlich ist es nicht sinnvoll eine leere Datei zuladen, Nichts in 'ner Stringliste ist halt eben Nichts in 'ner Stringliste, aber ich weiß dann schonmal sicher, dass ich Nichts habe und muss nicht mehr damit rechnen, dass ich im weiteren Programmverlauf nichtmal Nichts haben werde

Beim ForceFile weiß ich aber, dass das Verzeichis erstellt werden kann und das in dem Verzeichnis eine Datei erstellt werden kann. Man könnte die Funktion noch um eine IO-Prüfung erweiteren, so dass damit dann auch noch eventuell vorhandene Rechteprobleme, ... festgestellt werden könnten und dort einem nicht unerwarten eine Exception um die Ohren fliegt.
Delphi-Quellcode:
function ForceFile(dateiname: string; bereits_vorhandene_datei_trotzdem_neu_erstellen: Boolean = False) : Integer;
var
  f : Text;
  bOk : Boolean;
  iIOResult : Integer;
begin
  Result := 0;
  bOk := ForceDirectories(ExtractFilePath(Dateiname));
  if bOk then begin
    if not FileExists(dateiname) or bereits_vorhandene_datei_trotzdem_neu_erstellen then begin
      AssignFile(f, dateiname);
      {$I-}
      ReWrite(f);
      {$I+}
      Result := IOResult;
      CloseFile(f);
    end;
  end else begin
    Result := -MaxInt;
  end;
end;
...
iIOResult := ForceFile(datei);
case iIOResult of
  0 : begin
        Stringlist.Create;
        StringList.LoadfromFile(datei);
        ...
        StringList.SaveToFile(datei);
        StringList.Free;
     end;
  // hier ggfls. andere Werte von iIOResult gezielt abfragen und entsprechend reagieren.
  else
    // Fehlerbehandlung ...
  end;
end;
Und ja, die Frage ist, wieviel Aufwand will man da treiben?
  Mit Zitat antworten Zitat