2

私がこれに最初に気付いたのかどうかはわかりませんが、(笑、ちょっと面白いです...)電話をかけるたびに(これを確認するためにアプリケーションをデバッグしました)GetTempFileName(Windows.pasユニットから) )、それは私のD:\(なぜそこにあるのかわからない)ドライブに空の(0バイト)ファイルを作成します...

私は2つの論理ドライブを持っています...C:\(プライマリ)とD:\(論理)、これは最初の引数(arg0)が単なるドット('。')であるときに呼び出す場合にのみ発生します。これは奇妙です親ディレクトリが2ドット('..')であるため、D:\に作成されます。

とにかく、これに対するダミーのバイパスは、新しく作成されたファイルを削除することです... -_-、必要なのはファイルシステム自体ではなく、ファイル名だけです...

編集1:私の質問は、なぜこれが起こっているのですか?そして、呼び出しが新しい空のファイルを作成するのを避ける方法はありますか?

// Creates a name for a temporary file.
Function GetTempFileName(const ext: string): string;
var
  // This buffer should be MAX_PATH characters to accommodate the path plus the terminating null character.
  lpTempFileName: Array[0..MAX_PATH] of char;
begin
  // If uUnique is zero, GetTempFileName creates an empty file and closes it.
  // If uUnique is not zero, you must create the file yourself. Only a file name is created
  Windows.GetTempFileName('.', nil, 0, lpTempFileName);
  DeleteFile(lpTempFileName); // delete created file
  Result := ChangeFileExt(lpTempFileName, ext);
  Delete(Result, 1, 2); // ".\"
end;
4

1 に答える 1

13

GetTempFileName関数が新しい空のファイルを作成するのはなぜですか?

それはGetTempFileName関数の説明にあります(私が強調しています):

一時ファイルの名前を作成します。一意のファイル名が生成されると、空のファイルが作成され、そのファイルへのハンドルが解放されます。それ以外の場合は、ファイル名のみが生成されます。


GetTempFileName関数を使用するときに新しいファイルの作成を回避するにはどうすればよいですか?

関数に一意のファイル名(空のファイルを作成する)を生成させることはできません。または、GetTempFileName関数が戻った後に、作成された空のファイルを削除するだけです。参考文献から(私が強調):

この機能によって名前が作成された一時ファイルは、自動的に削除されません。これらのファイルを削除するには、DeleteFileを呼び出します

于 2013-03-09T16:01:58.980 に答える