Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 23.01.09 15:16 
Eine selbstlöschende temporäre Datei erstellen

Bei einem Projekt brauchte ich eine temporäre Datei. Diese sollte aber bei einem Programmabsturz nicht übrig bleiben, egal ob tatsächlich ein Fehler auftritt oder der Benutzer das Programm per TaskManager abschießt.

Dafür habe ich dann diese Funktion geschrieben:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
// Creates a temporary file which deletes itself automatically after closing
// the handle.
// Author:
//   Sebastian Jänicke
// Parameters:
//   [in]  Prefix:       Up to three characters (more are ignored) to be used
//                       as start of the filename.
//   [out] TempFileName: The filename of the created temporary file or an
//                       error description if the function fails.
// Return value:
//   Returns the file handle of the created temporary file.
//   If the function fails it returns INVALID_HANDLE_VALUE.
function CreateAutoTempFile(Prefix: Stringout TempFileName: String): THandle;
// uses: Windows, SysUtils
const
  FILE_SHARE_NONE = 0;
  // There is no constant for this, but I assume this is better readable than 0.
var
  TempPath: PChar;
  TempPathBufferSize: Integer;
begin
  Result := INVALID_HANDLE_VALUE;
  // Fetch the system's temporary directory
  TempPathBufferSize := GetTempPath(0nil);
  GetMem(TempPath, TempPathBufferSize);
  try
    if GetTempPath(TempPathBufferSize, TempPath) <> 0 then
    begin
      // Create a name for a temporary file in the temporary directory
      SetLength(TempFileName, MAX_PATH);
      if GetTempFileName(TempPath, PChar(Prefix), 0, PChar(TempFileName)) <> 0 then
      begin
        SetLength(TempFileName, StrLen(PChar(TempFileName)));
        // Create the temporary file
        Result := CreateFile(PChar(TempFileName), GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_NONE, nil, CREATE_ALWAYS,
          FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);
        if Result = INVALID_HANDLE_VALUE then
          TempFileName := SysErrorMessage(GetLastError);
      end
      else
        TempFileName := SysErrorMessage(GetLastError);
    end
    else
      TempFileName := SysErrorMessage(GetLastError);
  finally
    FreeMem(TempPath, TempPathBufferSize);
  end;
end;

Verwendung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  TempFileName: string;
  TempFileHandle: THandle;
begin
  TempFileHandle := CreateAutoTempFile('aaa', TempFileName);
  if TempFileHandle <> INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Dateiname: ' + TempFileName);
    CloseHandle(TempFileHandle);
  end
  else
    ShowMessage('Die Datei konnte nicht erstellt werden. Fehlermeldung:'#13#10
      + TempFileName);
end;
Wenn die Meldung (ShowMessage) noch auf dem Bildschirm ist, dann ist die Datei im Windows Explorer zu sehen, nach dem Klick auf Ok oder einem Abschuss des Programms im Taskmanager wird diese automatisch gelöscht.

Schönen Gruß,
Sebastian
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 23.01.09 15:25 
Anmerkung\Tipp: Wenn man die Datei als Stream in seiner Anwendung verwenden möchte, so hilft einem die Klasse THandleStream, der man im Konstruktor einfach das Handle der Datei übergibt. IMHO kann man in diesem Fall sogar die Verwaltung des Handles vollständig an die Stream-Klasse übergeben, was bedeutet, dass die Datei geschlossen wird, wenn das THandleStream-Objkt freigegeben wird. Mehr Auskunft dazu gibt die Delphi-Hilfe ;-)

[meta]Handle[/meta][meta]THandle[/meta][meta]API[/meta][meta]Datei[/meta][meta]TFileStream[/meta]

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.