如何生成唯一的文件名或路径?我正在寻找一种适用于Unix(类似)操作系统和Windows的解决方案。如何生成唯一的文件名或路径?
回答
两者都使用mktemp。 Windows已经得到了的posix调用版本,而linux调用是mktemp(3)。 mktemp的在Linux的命令行工具只是偶然调用
最简单的方法:产生一个随机数,并使用其十六进制值作为文件名(除非该文件存在,在这种情况下,您创建一个新的)。最简单的方法2:如果您只需要一些不存在的文件,请使用数字(或其十六进制值)作为文件名或其中的一部分,您只需增加数字直到不存在具有该名称的文件已经。
更复杂的方式:生成一个GUID并将其用作文件名(再次验证它没有被使用)。
您可以获取当前时间戳并将其用作文件名。或者只是将最后一个文件名增加1.
例如1.txt,2.txt等。
使用C库函数tmpfile
或tmpnam
。两者都存在于windows和linux下。
但要小心,当使用tmpfile时,它会在关闭程序时自动删除,所以也许tmpnam
更适合您。
从tmpnam的Linux手册页面:“不要使用此函数,而应使用mkstemp(3)或tmpfile(3)”。 – 2012-08-16 08:36:09
@ ThomasPadron-McCarthy:你说得对,当有人在获取名字和打开文件之间“劫持”你的文件时,可能存在安全问题。通常如果是临时文件,tmpfile是获取的方式。但在这种情况下,用户可能希望使其具有持久性。和mkstemp我不敢肯定,如果它在Windows下可用。 – flolo 2012-08-16 08:43:03
这是Linux的问题,而不是'tmpnam'。如果正确实施,没有理由不使用'tmpnam'。(公平地说,它很少以安全的方式实现,但'mkstemp'是Unix,而不是标准C,'tmpfile'不仅创建了一个名字,而且还以'FILE *'的形式打开了文件,这使得它非常漂亮没用。) – 2012-08-16 08:43:51
使用boost::uuid
:
#include <string>
using std::string;
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
#include <boost/uuid/uuid.hpp>
using boost::uuids::uuid;
#include <boost/uuid/uuid_generators.hpp>
using boost::uuids::random_generator;
#include <boost/uuid/uuid_io.hpp>
string make_uuid()
{
return lexical_cast<string>((random_generator())());
}
,并使用生成的UUID作为文件名(路径是不相关的,因此)。
但是这会*保证*唯一的文件名并处理竞争条件? – 2012-08-16 09:18:16
@ Component10,来自链接的文档:当UUID由其中一个定义的机制生成时,它们要么保证是唯一的,与所有其他生成的UUID不同(也就是说,它以前从未生成过,它永远不会生成再次),或者极有可能是独特的(取决于机制)。所以对你的问题的确切答案是它不是100%保证的。不过,我已经使用了这段时间很长一段时间,并且_never_发生了冲突。 – hmjd 2012-08-16 09:22:45
一致认为,由于uuid的范围,我正在迂腐。 :)我在这里看到的主要问题是如何确保您的文件在打开时尚不存在。关于这个问题的讨论可以在这里找到[http://stackoverflow.com/questions/9874002/how-to-create-a-file-only-if-it-doesnt-exist],但显然你做的更独特该文件的名称,如在你的答案中,这种情况发生的可能性较小。 – 2012-08-16 09:47:22
正如别处提到的那样,有tmpnam
。它通常执行得不好,以便与其他进程竞争。然而,在典型的单用户机器上,这通常是足够的。
在我自己的代码,我通常会先创建一个目录,进程ID 作为名称的一部分,并安排把我所有的临时文件在它 (使用一个简单的计数器来改变文件名);在共享磁盘上,我想 也将处理器ID打包到目录名称中(但我倾向于将 临时文件放在本地非共享驱动器上,这样可以避免大部分 问题)。
- 1. 如何为Tk顶层窗口路径生成唯一名称?
- 2. 生成唯一的临时文件路径
- 3. MPMediaItem生成唯一的文件名
- 4. 生成一个文件名列表,但没有文件路径
- 5. 从文件名生成唯一散列
- 6. 如何使用jfilechooser生成唯一的文件名?
- 7. 如何为django模型生成唯一的文件名.FileField
- 8. 使用Polymorphic回形针生成一个唯一的文件路径
- 9. Rails:如何生成路径?
- 10. GEt唯一的文件名而不是整个路径
- 11. 生成唯一名称?
- 12. 新的文件(路径)或class.getResourses(路径)?
- 13. 将唯一文件路径转换为唯一整数
- 14. 使用Maven生成类路径文件
- 15. 路径,目录和/或文件名
- 16. 如何以需要的格式生成文件路径?
- 17. 如何更改Hugo生成的html文件路径?
- 18. 如何生成相对于Javascript/jQuery文件的路径?
- 19. 在生成文件中将Cygwin路径转换为Windows路径
- 20. 得到给定一个路径和文件名路径名
- 21. CQ5 - 如何获取呈现的JSP路径或文件名
- 22. 如何识别没有文件名或文件路径的文件?
- 23. 如何在RoR中生成唯一的匿名用户名?
- 24. 从字符串生成唯一文件夹名称的问题
- 25. C#:什么是生成唯一文件名的最快方法?
- 26. 如何从路径获取文件名?
- 27. 文件或流的路径?
- 28. 的CreateFile与东亚路径名称与无效批量路径或文件名
- 29. 如何从Model类中的路径生成路径/ URL?
- 30. Symfony 2:如何在JavaScript文件中生成图像路径?
Ouuh..Does存在任何独特corossplatform的解决方案,它产生像类似于在我的Debian发行版在临时目录的名称上WIN_ – pandreym 2012-08-16 08:50:51
名,男子3 mktemp的指示,而不是使用mkstemp ,因为mktemp是安全风险 – pandreym 2012-08-16 08:52:18
名称{XXXX_XXXX_XXXX_XXXX ..}和等 – Colin 2014-10-23 22:57:18