在指定目录中便携式生成新文件名

时间:2010-11-05 15:45:13

标签: c++

我如何可移植(我对windows和linux最感兴趣)在指定目录中生成一个新文件名,并带有指定的文件名前缀和后缀?

std::string UniqueName(std::string const& dir, std::string const& prefix,
                       std::string const& suffix);

实现此功能的任何建议,尽可能少地明确依赖于特定平台。

5 个答案:

答案 0 :(得分:19)

请注意,做错了是一个安全漏洞。有利用临时(ish)文件的技巧,这些可以授予管理员访问整个系统的权限,而不仅仅是你的应用程序。有关建议,请参阅this

有两种方法可以做到这一点:

boost::filesystem计划成为C ++ TR2的一部分,将来几乎所有编译器都应该支持它。请注意,您必须#define BOOST_FILESYSTEM_VERSION 3info),否则您将获得不支持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)

鉴于您拥有的签名,该功能无法完美实现。对于文件系统,您经常遇到竞争条件的问题:

  • 您的函数决定使用文件名“foobar”
  • 其他人创建文件“foobar”
  • 你的程序无法打开“foobar”,因为第2步中的其他人会打败你。

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;
}