AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ForceFile

Ein Thema von Monday · begonnen am 23. Jul 2022 · letzter Beitrag vom 25. Jul 2022
Antwort Antwort
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#1

ForceFile

  Alt 23. Jul 2022, 08:30
Es gibt ja ein ForceDirectory, aber kein ForceFile.

Deshalb habe ich eines gemacht. Ist zwar nicht spektakulär, aber für faule Menschen wie mich




ForceFile erstellt eine Textdatei, wenn sie noch nicht vorhanden ist.

Optional: Löscht und erstellt eine Textdatei, wenn sie schon vorhanden ist (z.B., wenn man den Inhalt einer vorhandenen Textdatei löschen möchte und mit einer leeren Textdatei beginnen möchte).


Delphi-Quellcode:
procedure ForceFile(dateiname: string; bereits_vorhandene_datei_trotzdem_neu_erstellen: boolean = False);
var
  f: text;
begin
{
bereits_vorhandene_datei_trotzdem_neu_erstellen -> True.
z.B. wenn man eine leere Datei haben will, und ein bereits vorhandener Dateiinhalt nicht mehr weiterverwendet werden soll
}

  if not FileExists(dateiname) then begin
    assignfile(f, dateiname);
    rewrite(f); //writeln(f, '');
    closefile(f);
  end;
  if bereits_vorhandene_datei_trotzdem_neu_erstellen then begin
    DeleteFile(dateiname);
    assignfile(f, dateiname);
    rewrite(f); //writeln(f, '');
    closefile(f);
  end;
end;


Beispiel:
ForceFile('bericht.txt');


Oder auch eine vorhandene Datei neuerstellen:
ForceFile('bericht.txt',True);

Man spart sich im eigentlichen Code ein paar Zeilen Code.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ForceFile

  Alt 23. Jul 2022, 11:14
Delphi-Quellcode:
function MakeFile(const AFilename: string; const AOverwrite: Boolean = False; const AShowError: Boolean = False): Boolean;
const
  INVALID_HANDLE_VALUE = THandle(-1);
var
  h: THandle;
begin
  Result := False;
  if (AFilename = '') then
    Exit;
  if (AOverwrite and FileExists(AFilename)) then
    if (not DeleteFile(AFilename)) then
    begin
      if AShowError then
        ShowMessage('File deletion for "' + AFilename + '" failed.');
      Exit;
    end;
  if (not FileExists(AFilename)) then
  begin
    h := FileCreate(AFilename);
    if (h = INVALID_HANDLE_VALUE) then
      begin
        if AShowError then
          ShowMessage('File creation for "' + AFilename + '" failed.');
        Exit;
      end
      else
      begin
        FileClose(h);
        Result := True;
      end;
  end
  else
    Result := True;
end;
Eine weitere Möglichkeit.

//Edit, methode ist nun eine function und man könnte es als "if makefile('blabla.bla')" nutzen
Gruß vom KodeZwerg

Geändert von KodeZwerg (24. Jul 2022 um 09:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.270 Beiträge
 
Delphi 12 Athens
 
#3

AW: ForceFile

  Alt 23. Jul 2022, 19:36
Delphi-Quellcode:
procedure ForceFile(dateiname: string; bereits_vorhandene_datei_trotzdem_neu_erstellen: Boolean = False);
var
  f: Text;
begin
  if not FileExists(dateiname) or bereits_vorhandene_datei_trotzdem_neu_erstellen then begin
    //DeleteFile(dateiname); // nicht nötig, weil der Inhalt wird ja eh gelöscht/überschrieben
    AssignFile(f, dateiname);
    Rewrite(f); //WriteLn(f, '');
    CloseFile(f);
  end;
end;



Das behebt auch das "Problemchem" mit dem doppelten Erstellen, wenn NotExist und bereits_vorhandene...
Alernativ wäre ein ELSE zwischen den IF auch eine Lösung dafür.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.090 Beiträge
 
Delphi 12 Athens
 
#4

AW: ForceFile

  Alt 23. Jul 2022, 19:52
Mir erschließt sich noch nicht ganz der Sinn der ganzen Aktion. Für einen Lesezugriff ist das ja eher uninteressant, eine leere Datei zu erstellen bzw. eine existierende mit einer leeren ersetzen. Für das Lesen ist doch eher wichtig ob die Datei überhaupt existiert.

Beim Schreiben hilft mir das aber auch nicht viel weiter, da kann ich dann nach dem ForceFile zwar auf das Create verzichten und ein simples OpenFile verwenden, aber der Aufwand in ForceFile erscheint mir dafür nicht wirklich angemessen.

In solchen Fällen verwende ich dann eher einen TStreamWriter, je nach gewünschten Verhalten mit Append = True oder False. Dann habe ich die Datei gleich am Wickel im Zugriff und niemand kann sie so einfach zwischen einem ForceFile und OpenFile wieder löschen.

Ich bin aber offen für Szenarien, bei denen eine solche Funktionalität sinnvoll sein kann.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#5

AW: ForceFile

  Alt 24. Jul 2022, 06:03
@Uwe

Ich habe es verwendet für TSTringList.loadFromFile() . Da muss es die Datei schon geben. Und ich wollte nur ein einfaches Protokoll/Bericht anfertigen, das dann auch evtl. weitergeführt werden sollte.

Da finde ich den Einzeiler dann schon ganz nett, und muss nicht denn Programmablauf, mit file exists und so weiter "stören":


forcefile(datei)
Stringlist.create
StringList.loadfromFile(datei)
...

Geändert von Monday (24. Jul 2022 um 06:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.270 Beiträge
 
Delphi 12 Athens
 
#6

AW: ForceFile

  Alt 24. Jul 2022, 09:34
Da du sowieso ein FileExists benutzt, warum dann nicht einfach if FileExists(...) then SL.LoadFromFile(..); ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: ForceFile

  Alt 24. Jul 2022, 09:49
Das würd' ich dann aber noch etwas anpassen:
Delphi-Quellcode:
function ForceFile(dateiname: string; bereits_vorhandene_datei_trotzdem_neu_erstellen: Boolean = False) : Boolean;
var
  f: Text;
begin
  Result := ForceDirectories(ExtractFilePath(Dateiname));
  if Result then begin
    if not FileExists(dateiname) or bereits_vorhandene_datei_trotzdem_neu_erstellen then begin
      AssignFile(f, dateiname);
      ReWrite(f);
      CloseFile(f);
    end;
  end;
  Result := FileExists(dateiname);
end;
...
if ForceFile(datei) then begin
  Stringlist.Create;
  StringList.LoadfromFile(datei);
  ...
  StringList.SaveToFile(datei);
  StringList.Free;
end else begin
  // Fehlerbehandlung ...
end;
Bei fehlender Verzeichnisstruktur wird Deine Variante (vermutlich) scheitern, himitsus Einzeiler if FileExists(...) then SL.LoadFromFile(..); ebenfalls, wenn die Stringliste per SaveToFile gespeichert werden soll.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.937 Beiträge
 
Delphi 12 Athens
 
#8

AW: ForceFile

  Alt 25. Jul 2022, 07:12
Mir erschließt sich noch nicht ganz der Sinn ...
Ja, das ist auch mein HauptProblem damit.

Ich könnte mir zwar vorstellen das es da sinnvoll sein könnte wo zwingend Files vorhanden sein sollten, z.B. .ini, .log,
um die Abläufe zu vereinheitlichen bei einfachen Files an denen angehängt werden soll.

Wenn bei Programmstart einmal ForceFile aufgerufen wird, werden diese auf jeden Fall angelegt und nutzbar und man muss sich beim Schreiben nicht mehr drum kümmern.

Trotzdem würde ich auf ein FileExists niemals verzichten und die Frage wäre dann was passieren soll wenn das File doch fehlt (hat irgendwer wie Virenscanner gelöscht).
Dann müsste man das File ja doch wieder an der Stelle neu createn, was ein ForceFile bei Programmstart wieder überflüssig machen würde.

Ein Beispiel wo man ForceFile unbedingt braucht wäre schön
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ForceFile

  Alt 25. Jul 2022, 07:59
er spart sich halt beim programm start eine seperate abfrage (könnte theoretisch sofort auf irgend eine art "laden") aber prüft leider kein ergebnis, himitsu sein vorschlag mit einem permanent geöffneten handle plus prüfung finde ich pers. am sinnvollsten für seinen zweck.
(wenn sinn und zweck sein soll sicherzustellen das solange das programm aktiv ist auch diese datei für das programm zur verfügung steht)
Gruß vom KodeZwerg

Geändert von KodeZwerg (25. Jul 2022 um 08:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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