我如何可移植(我对windows和linux最感兴趣)在指定目录中生成一个新文件名,并带有指定的文件名前缀和后缀?
std::string UniqueName(std::string const& dir, std::string const& prefix,
std::string const& suffix);
实现此功能的任何建议,尽可能少地明确依赖于特定平台。
答案 0 :(得分:19)
请注意,做错了是一个安全漏洞。有利用临时(ish)文件的技巧,这些可以授予管理员访问整个系统的权限,而不仅仅是你的应用程序。有关建议,请参阅this。
有两种方法可以做到这一点:
GetTempFileName
,在Linux上使用mkstemp
。boost::filesystem::unique_path
,可让您根据自己提供的模板可靠地生成唯一的文件名。 boost::filesystem
计划成为C ++ TR2的一部分,将来几乎所有编译器都应该支持它。请注意,您必须#define BOOST_FILESYSTEM_VERSION 3
(info),否则您将获得不支持boost::filesystem
的旧版unique_path
。
答案 1 :(得分:2)
您可以生成UUID以创建唯一名称。有关C ++中的实现列表,请参阅this link。
答案 2 :(得分:1)
对于Windows解决方案,Generate a guid并将其用作文件名
以下是生成guid以帮助您入门的代码。
_TUCHAR *guidStr = 0x00;
GUID *pguid = 0x00;
pguid = new GUID;
CoCreateGuid(pguid);
// Convert the GUID to a string
UuidToString(pguid, &guidStr);
delete pguid;
答案 3 :(得分:0)
鉴于您拥有的签名,该功能无法完美实现。对于文件系统,您经常遇到竞争条件的问题:
POSIX机器具有解决此问题的功能:mkstemp
。不幸的是,没有Windows等同于此。在Windows上,使用GetTempFileName
,更接近mktemp
,但在调用CreateFile
时使用CREATE_NEW
,如果文件存在,将导致CreateFile
失败。从那里,您可以实现Windows版mkstemp
。
答案 4 :(得分:0)
未经测试的代码,但我在一些项目中使用非常相似的东西
std::string UniqueName(std::string const& dir = _T(""), std::string const& prefix = _T(""), std::string const& suffix = _T(""))
{
std::string retVal = _T("");
std::string sDirectory = boost::filesystem::temp_directory_path().string();
if ( ! dir.empty() )
sDirectory = dir;
std::string sFilesName = _T("%%%%-%%%%-%%%%-%%%%");
if ( ! prefix.empty() )
sFilesName = prefix;
boost::format fmter( _T("%s%s%s") );
std::string sModel = boost::str ( boost::format ( fmter
% sDirectory
% sFilesName
% suffix ) );
boost::filesystem::path temp = boost::filesystem::unique_path(sModel);
retVal = temp.string();
return retVal;
}