2012-08-16 65 views

回答

4

两者都使用mktemp。 Windows已经得到了的posix调用版本,而linux调用是mktemp(3)。 mktemp的在Linux的命令行工具只是偶然调用

+0

Ouuh..Does存在任何独特corossplatform的解决方案,它产生像类似于在我的Debian发行版在临时目录的名称上WIN_ – pandreym 2012-08-16 08:50:51

+0

名,男子3 mktemp的指示,而不是使用mkstemp ,因为mktemp是安全风险 – pandreym 2012-08-16 08:52:18

+0

名称{XXXX_XXXX_XXXX_XXXX ..}和等 – Colin 2014-10-23 22:57:18

0
  • 最简单的方法:产生一个随机数,并使用其十六进制值作为文件名(除非该文件存在,在这种情况下,您创建一个新的)。最简单的方法2:如果您只需要一些不存在的文件,请使用数字(或其十六进制值)作为文件名或其中的一部分,您只需增加数字直到不存在具有该名称的文件已经。

  • 更复杂的方式:生成一个GUID并将其用作文件名(再次验证它没有被使用)。

-1

您可以获取当前时间戳并将其用作文件名。或者只是将最后一个文件名增加1.
例如1.txt,2.txt等。

0

使用C库函数tmpfiletmpnam。两者都存在于windows和linux下。

但要小心,当使用tmpfile时,它会在关闭程序时自动删除,所以也许tmpnam更适合您。

+2

从tmpnam的Linux手册页面:“不要使用此函数,而应使用mkstemp(3)或tmpfile(3)”。 – 2012-08-16 08:36:09

+0

@ ThomasPadron-McCarthy:你说得对,当有人在获取名字和打开文件之间“劫持”你的文件时,可能存在安全问题。通常如果是临时文件,tmpfile是获取的方式。但在这种情况下,用户可能希望使其具有持久性。和mkstemp我不敢肯定,如果它在Windows下可用。 – flolo 2012-08-16 08:43:03

+0

这是Linux的问题,而不是'tmpnam'。如果正确实施,没有理由不使用'tmpnam'。(公平地说,它很少以安全的方式实现,但'mkstemp'是Unix,而不是标准C,'tmpfile'不仅创建了一个名字,而且还以'FILE *'的形式打开了文件,这使得它非常漂亮没用。) – 2012-08-16 08:43:51

5

使用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作为文件名(路径是不相关的,因此)。

+1

但是这会*保证*唯一的文件名并处理竞争条件? – 2012-08-16 09:18:16

+0

@ Component10,来自链接的文档:当UUID由其中一个定义的机制生成时,它们要么保证是唯一的,与所有其他生成的UUID不同(也就是说,它以前从未生成过,它永远不会生成再次),或者极有可能是独特的(取决于机制)。所以对你的问题的确切答案是它不是100%保证的。不过,我已经使用了这段时间很长一段时间,并且_never_发生了冲突。 – hmjd 2012-08-16 09:22:45

+0

一致认为,由于uuid的范围,我正在迂腐。 :)我在这里看到的主要问题是如何确保您的文件在打开时尚不存在。关于这个问题的讨论可以在这里找到[http://stackoverflow.com/questions/9874002/how-to-create-a-file-only-if-it-doesnt-exist],但显然你做的更独特该文件的名称,如在你的答案中,这种情况发生的可能性较小。 – 2012-08-16 09:47:22

1

正如别处提到的那样,有tmpnam。它通常执行得不好,以便与其他进程竞争。然而,在典型的单用户机器上,这通常是足够的。

在我自己的代码,我通常会先创建一个目录,进程ID 作为名称的一部分,并安排把我所有的临时文件在它 (使用一个简单的计数器来改变文件名);在共享磁盘上,我想 也将处理器ID打包到目录名称中(但我倾向于将 临时文件放在本地非共享驱动器上,这样可以避免大部分 问题)。

+0

在我的代码中,我将生成像const__string-pid @主机 – pandreym 2012-08-16 08:55:49

+0

这样的名称但我需要更多独特的.. – pandreym 2012-08-16 08:56:23

+1

@ user1602627你是什么意思“更独特“?名称可以是唯一的,也可以不是。你可以生成你想要的任何名字,在各种各样的信息中加入,如进程ID,用户ID,时间(如果你想要的话,以微秒为单位),机器MAP地址等等。抛出你读过的一些字节如果你愿意,也可以从'/ dev/random'。 – 2012-08-16 10:11:23

相关问题