GetTempFileName创建一个空文件

2 delphi winapi

我不确定我是不是第一个注意到这个,但是(笑,有点好笑......)当我打电话时(我调试了应用程序来验证这一点)GetTempFileName(来自Windows.pas单元) ),它在我的D:\(不知道为什么有)驱动器中创建一个空(0字节)文件...

我有2个逻辑驱动器...... C:\(主要)和D:\(逻辑),现在只有在第一个参数(arg0)只是一个点('.')时才调用它,这很奇怪对我来说,它在D:\中创建它,因为父目录是2个点('..').

无论如何,这个虚拟旁路就是删除新创建的文件... -_-,我只需要文件NAME,而不是文件系统本身......

编辑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;
Run Code Online (Sandbox Code Playgroud)

TLa*_*ama 11

为什么GetTempFileName函数会创建新的空文件?

它在GetTempFileName功能描述中(我强调):

为临时文件创建名称.如果生成了唯一的文件名,则会创建一个空文件并释放其句柄; 否则,仅生成文件名.


使用GetTempFileName函数时如何避免创建新文件?

要么你不能让函数生成一个唯一的文件名(创建一个空文件),要么只是在GetTempFileName函数返回后删除创建的空文件.从参考文献(我强调):

名称由此函数创建的临时文件不会自动删除.要删除这些文件,请调用DeleteFile.

  • 您还可以考虑使用System.IOUtils.TPath.GetGUIDFileName生成可用作唯一文件名的新GUID.调用GetGUIDFileName以生成适合作为文件或目录的唯一名称的新GUID.GetGUIDFileName仅生成文件名,不会创建真实文件. (5认同)
  • 只是对这种方法发出警告.防病毒(或其他应用程序)会不时地拾取文件以在GetTempFileName和删除之间扫描它.这将导致删除失败,因为该文件正由另一个进程使用. (4认同)