12

我想从一些 C 代码(不是 C++ 或 C#)在 Windows 中创建一个唯一的临时目录。我想这样做,以便可以将一些临时文件放在目录中,然后在完成后轻松删除它们(通过递归删除目录)。

我本质上是在寻找与 linux mkdtemp 功能等效的东西。这里有一个 C# 答案,对这个问题的回答 建议使用 Boost。但是由于我使用的是 C,因此这些解决方案对我不起作用。

到目前为止,我能想到的最好的方法是使用 GetTempFileNameCreateDirectory但问题是,如果我要求 GetTempFileName 创建一个唯一的文件名,它也会创建文件(我不想要,因为我想创建一个目录)。

相关的是 GetTempPath,它从环境变量返回用户临时文件夹的位置 - 但由于我想创建自己的目录,以后可以安全地删除,我仍然需要在它返回的任何路径内创建一个目录。

看起来如果我想创建一个唯一的目录,我必须创建一个临时文件,获取名称,删除它,然后创建一个同名的目录 - 这听起来很混乱。还有其他想法吗?

4

3 回答 3

9

您可以使用GetTempPath与 Guid 连接的返回值来确保目录的唯一性。您可以使用UuidCreateCoCreateGuid Function创建 Guid 。

要递归删除目录,这里有一个纯 C 示例:如何递归删除目录?基于 FindFirstFile、FindNextFile、DeleteFile 和RemoveDirectory

还有SHFileOperation但它更重量级,并且基于 Windows Shell 函数,并且并非总是需要 Shell DLL,尤其是在您编写服务器代码时。

于 2011-06-09T04:55:37.473 回答
4

GetTempPath然后在其下使用CreateDirectory随机名称,如果CreateDirectory由于它已经存在而失败,则可选择重试。但是,如果您的名称生成足够好,与现有名称发生冲突的可能性远小于黑帽猜测您的密码甚至您的私钥的可能性,因此您不妨忽略它。

于 2011-06-09T03:09:23.620 回答
3

用于创建尚不存在的文件名,然后用于创建目录。如果您这样做,从技术上讲存在竞争条件,因为另一个进程可能会在您生成文件名和创建目录之间的时间创建一个具有该名称的文件或目录,但这种可能性不大。为了防止这种情况,您可以循环直到成功。_tempnam tmpnam_sCreateDirectory

要递归删除目录树,您可以使用SHFileOperation. FindFirstFile或者,您可以使用/ FindNextFileDeleteFile和自己进行目录遍历RemoveDirectory

如果要在退出时自动删除目录,请使用atexit. 这仅适用于正常程序终止(即通过exit函数或通过从main/返回WinMain)。这不适用于异常程序终止(例如 via abort、访问冲突、其他人调用TerminateProcess等)。

于 2011-06-09T04:42:06.073 回答