Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Name für temporäre Datei erzeugen (https://www.delphipraxis.net/129530-name-fuer-temporaere-datei-erzeugen.html)

implementation 20. Feb 2009 16:51


Name für temporäre Datei erzeugen
 
Ich habe eine Routine CreateTempFile geschrieben, die einen Dateinamen für eine Temporäre Datei erzeugen soll:

CreateTempFile(
Nummer der temporären Datei, index
Mindestanzahl der Stellen der Nummernausgabe, digits (=4)
Tildenersatz, divider (='~')
VorlageString fmt (='~wdpai~$.tmp')
): string;

Die einzelnen Zeichen des VorlageStrings sollen wie folgt behandelt werden:
~ wird durch den Wert des Parameters divider ersetzt
$ wird durch die Nummernausgabe (in HEX) ersetzt
alle anderen Zeichen werden in den Dateinamen übernommen.
Delphi-Quellcode:
function CreateTempFile(index:word;digits:byte=4;divider:char='~';fmt:string='~wdpai~$.tmp'):string;
var i: byte;
begin
  for i := 1 to Length(fmt) do
    if fmt[i]='~' then Result := Result+divider
    else if fmt[i]='$' then Result := Result+IntToHex(index,digits)
    else Result := fmt[i];
end;
Jetzt das Problem:
Ich habe die Funktion getestet:
Delphi-Quellcode:
CreateTempFile(0,2,'#','tmp$.~~~')
Das Ergebnis war jedoch icht wirklich befriedigend: '.###'
Immerhin haben die Tilden gefunzt - und der Punkt.
Doch vom Rest keine Spur.

jaenicke 20. Feb 2009 16:56

Re: Name für temporäre Datei erzeugen
 
Die Funktionen GetTempPath und GetTempFileName kennst du aber? ;-)

Oder warum muss der Name der Datei so kompliziert sein?

Dieser Beitrag könnte dich auch interessieren:
http://www.delphi-library.de/viewtopic.php?p=545554

nahpets 20. Feb 2009 16:57

Re: Name für temporäre Datei erzeugen
 
Hallo,

muss das nicht
Delphi-Quellcode:
else Result := Result + fmt[i];
heißen?

himitsu 20. Feb 2009 16:59

Re: Name für temporäre Datei erzeugen
 
Hier im Forum suchenGetTempFileName
http://www.delphipraxis.net/internal...t.php?t=132456
http://www.delphipraxis.net/internal...ct.php?t=78459

und noch die CodeLib
http://www.delphipraxis.net/internal...ect.php?t=6961


Was passiert eigentlich, wenn die schon eine Datei, mit dem Namen von CreateTempFile, existiert?


@nahpets: jupp, müßte es

Zitat:

Das Ergebnis war jedoch icht wirklich befriedigend: '.###'
Immerhin haben die Tilden gefunzt - und der Punkt.
Doch vom Rest keine Spur.
daher auch dein Problem (siehe nahpets)

Nicht-Maskenzeichen löschten den vorherigen Result-String.
der Punkt war das letzte Nicht-Maskenzeichen und stand somit noch drin ... nja und alle folgenen Maskenzeichen.

[add]
aber wenn es unbedingt so funktionieren soll:

Schon mal was von StringReplace gehört?
Delphi-Quellcode:
function CreateTempFile(index: Word; digits: Byte = 4;
  divider: Char='~'; fmt: String='wdpai%s%.*d.tmp'): String;
begin
  Result := StringReplace(fmt, '~', divider, [rfReplaceAll]);
  Result := StringReplace(Result, '$', IntToHex(index, digits), [rfReplaceAll]);
end;
Ich hätt das Ganze allerdings eher mit Format gelöst
und die Maske etwas angepaßt.
Delphi-Quellcode:
function CreateTempFile(index: Word; digits: Byte = 4;
  divider: Char='~'; fmt: String='wdpai%s%.*d.tmp'): String;
begin
  Result := Format(fmt, [divider, digits, index]);
end;

implementation 24. Feb 2009 14:09

Re: Name für temporäre Datei erzeugen
 
Zitat:

Zitat von nahpets
Hallo,

muss das nicht
Delphi-Quellcode:
else Result := Result + fmt[i];
heißen?

Da hast du Recht.
Das war das Problem.
Zitat:

Zitat von jaenicke
Die Funktionen GetTempPath und GetTempFileName kennst du aber? ;-)

Sicher, es geht hier aber darum, einen Dateinamen für eine temporäre Datei im gleichen Verzeichnis zu erzeugen.

Zitat:

Zitat von himitsu
Schon mal was von StringReplace gehört?
Delphi-Quellcode:
function CreateTempFile(index: Word; digits: Byte = 4;
  divider: Char='~'; fmt: String='wdpai%s%.*d.tmp'): String;
begin
  Result := StringReplace(fmt, '~', divider, [rfReplaceAll]);
  Result := StringReplace(Result, '$', IntToHex(index, digits), [rfReplaceAll]);
end;

Nein, StringReplace kannte ich nicht.
Eswäre wohl aber eine sinnvolle Lösung.
Zitat:

Zitat von himitsu
Ich hätt das Ganze allerdings eher mit Format gelöst
und die Maske etwas angepaßt.
Delphi-Quellcode:
function CreateTempFile(index: Word; digits: Byte = 4;
  divider: Char='~'; fmt: String='wdpai%s%.*d.tmp'): String;
begin
  Result := Format(fmt, [divider, digits, index]);
end;

Mir Format wollte ich es nicht lösen, da ich meine eigenen Replace-Zeichen dafür wollte.

himitsu 24. Feb 2009 14:29

Re: Name für temporäre Datei erzeugen
 
Das Problem an deinem Code ist allerdings, daß dieses einfach nur einen Namen zusammenstellt, anhand der Forgaben für diese Funktion (index, digits, divider und fmt),
aber dabei nicht sicherstellt, daß nicht schon eine Datei mit diesem Namen existiert.

falls du dir die anderen Beispiele man ansiehst, wird dort noch geschaut ob der gewählte Name noch frei ist und wenn nicht, dann wird sooft der Name geändert, bis die Datei genutzt werden kann.

und du kannst bei einigen der Funktionen auch ein anderes Verzeichnis angeben.


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