Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal Datein durchnummeriert speichern (https://www.delphipraxis.net/180621-datein-durchnummeriert-speichern.html)

darky95 3. Jun 2014 16:39

Datein durchnummeriert speichern
 
Hi Leute, hoffe ich bin hier jetzt richtig gelandet :)

Bin dabei eine kleine Auswertung zu Programmieren und will nun eingegebene Daten in txt's speichern! Für jeden Datensatz (Name, Vorname, Verein etc) soll eine extra txt erstellt werden! Und die sollen durchnummeriert sein (von 1 bis x)! Komme nur nicht auf den passenden ansatz!
Code:
procedure TForm2.btnHinzuClick(Sender: TObject);

var List:TStrings;
begin

  Teilnehmer.Name:=edtName.Text;
  Teilnehmer.Vorname:=edtVorname.Text;
  Teilnehmer.Verein:=edtVerein.Text;
  Teilnehmer.Ort:=edtOrt.Text;
  Teilnehmer.BK:=edtBK.Text;

  List:=TStringList.create;

  try
    List.Add(Teilnehmer.Name);
    List.Add(Teilnehmer.Vorname);
    List.Add(Teilnehmer.Verein);
    List.Add(Teilnehmer.Ort);
    List.Add(Teilnehmer.BK);


    if not DirectoryExists('C:/Turnierauswertung/Schuetzen/') then ForceDirectories('C:/Turnierauswertung/Schuetzen/');
    List.SaveToFile('C:/Turnierauswertung/Schuetzen/'+ {hier fehlt was!} +'.txt') ;
  finally
    List.Free;
  end;



  end;

Helmi 3. Jun 2014 16:47

AW: Datein durchnummeriert speichern
 
Hallo,

ich hatte mal die gleiche Anforderung.

Ich hab´s so gelöst, dass ich prüfe, ob der Dateiname (inkl. der Nummerierung) vorhanden ist.
Ist der Dateiname vorhanden, zähl ich hoch und prüf wieder, bis der Dateiname nicht mehr
vorhanden ist. Das ist dann der nächst freie Dateiname.

Hier mal mein Code:
Delphi-Quellcode:
function SicherungName(Pfad, DateiName, Endung: String): String;
var
  i: Integer;

begin
  //Variablen vordefinieren
  Result := '';
  i      := 1;

  //Pfad mit einem Backslash enden lassen
  Pfad   := IncludeTrailingPathDelimiter(Pfad);

  while true do
    begin
      //Dateinamen zusammenstellen
      Result := Pfad + Format('%s%.3d.%s', [DateiName, i, Endung]);

      //wenn Datei nicht vorhanden, dann Schleife beenden
      If not FileExists(Result) then
        break;

      inc(i);
    end;
end;
Hat nur einen Schönheitsfehler. Löscht man eine Datei mit kleiner Nummer, so
wird automatisch aufgefüllt. Z. B. es gibt Test01, Test02 und Test03 und man
löscht Test02, so wird beim nächsten Speichern in Test02 und dann wieder ab
Test04 gespeichert.

himitsu 3. Jun 2014 17:04

AW: Datein durchnummeriert speichern
 
Zitat:

Zitat von Helmi (Beitrag 1261236)
Hat nur einen Schönheitsfehler. Löscht man eine Datei mit kleiner Nummer, so
wird automatisch aufgefüllt. Z. B. es gibt Test01, Test02 und Test03 und man
löscht Test02, so wird beim nächsten Speichern in Test02 und dann wieder ab
Test04 gespeichert.

Gut, man könnte einfach nochmal die nächsten 10 Dateien prüfen, ob es da nicht eventuell was gibt,
aber dann löscht jemand mal 11 Dateien und man hat wieder das Problem. (Meist) Unnötig viele Dateien zu Prüfen ist aber auch bissl blöd.



Man könnte aber auch eine Vergleichsmaske generieren, dann geht man durch das Verzeichnis und sucht alle Dateien, welcher dieser Maske entsprechen.
Nun initialisiert man seinen Startwert, für die Zählung und geht dann diese Dateinamen durch, extrahiert aus dem Namen die Nummer und schaut, ob sie größer oder gleich der eigenen Nummer ist, wenn ja, dann erhöht man seine Nummer (aktuell=ausgelesen+1) und geht die Namen weiter durch. Am ende hat man dann immer die höchste Nummer.

OK, wenn jemand die letzte Nummer löscht, dann würde diese Nummer "doppelt" vorkommen.
In diesem Fall muß man praktisch irgendwo anders die zuletzt verwendete Nummer speichern und verwendet dann immer Diese, so wie bei den Indexfeldern (Serial) in den Tabellen einer Datenbank.

Helmi 3. Jun 2014 17:12

AW: Datein durchnummeriert speichern
 
Ich hab meine Methode mal für eine Screenshot-Software benötigt, die die erzeugten Bilder automatisch speichert.
So hat automatisch jedes Bild einen eigenen Dateinamen, der auch noch durchnummeriert ist. Deswegen hab ich keinen
Wert darauf gelegt, dass es immer aufwärts gezählt sondern einfach ein freier Dateiname genutzt wird.

DeddyH 3. Jun 2014 17:32

AW: Datein durchnummeriert speichern
 
Und wenn man statt einer Nummerierung einen Dateinamen aus Datum und Uhrzeit wählt? Im Bezug auf Sortierung etc. wäre das genauso einfach zu handhaben.

Mikkey 3. Jun 2014 17:38

AW: Datein durchnummeriert speichern
 
Vorschlag:

Lies das Verzeichnis nach Dateien nach Deinem Muster (z.B. Personxxxxx.txt) durch.

Suche den höchsten xxxxx-Wert und beginne dann mit xxxxx+1.

Die Zeile hieße dann:

Delphi-Quellcode:
var
  lfd: Integer;
...
  {bestimme lfd}
  ...
  List.SaveToFile(Format('C:/Turnierauswertung/Schuetzen/Person%.05d.txt', [lfd])) ;

alda 3. Jun 2014 17:42

AW: Datein durchnummeriert speichern
 
Bist Du denn gezwungen die Daten so abzulegen? Wenn nicht, würde ich das eventuell nochmal überdenken.

Vielleicht hilft es, wenn Du Deine eigentlichen Anwendungsfall etwas näher beschreibst ;-)


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