2

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

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

无论如何,对此的虚拟绕过就是删除新创建的文件...-_-,我需要的只是文件名,而不是文件系统本身...

Edit1:我的问题是,为什么会这样?有没有办法避免调用创建一个新的空文件?

// 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 回答