在Windows中从纯C创建唯一的临时目录

时间:2011-06-09 02:33:22

标签: c windows winapi temporary-directory

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

我实际上是在寻找相当于linux的东西 mkdtemp 功能。有一个C#答案here,以及对this question的回复 建议使用Boost。但由于我使用的是C,这些解决方案无效 对我来说。

到目前为止,我能够提出的最好的是使用 GetTempFileName 然后是CreateDirectory, 但问题是,如果我问 GetTempFileName 要创建一个唯一的文件名,它还会创建文件(我 不想要,因为我想制作一个目录。)

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

如果我想要创建一个唯一的目录,我将不得不这样做 创建临时文件,获取名称,删除它,然后创建一个 具有相同名称的目录 - 听起来非常混乱。 还有其他想法吗?

3 个答案:

答案 0 :(得分:9)

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

要以递归方式删除目录,纯C中有一个示例:How to remove directory recursively?基于FindFirstFile,FindNextFile,DeleteFile和RemoveDirectory

还有SHFileOperation但它更重量级并且基于Windows Shell函数,并且并不总是需要Shell DLL,特别是如果您正在编写服务器代码。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

要递归删除目录树,可以使用SHFileOperation。或者,您可以使用FindFirstFile / FindNextFileDeleteFileRemoveDirectory自行遍历目录。

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