代码之家  ›  专栏  ›  技术社区  ›  andreas buykx

指定目录中新文件名的可移植生成

c++
  •  11
  • andreas buykx  · 技术社区  · 15 年前

    我怎么能 轻便的 (我对windows和linux最感兴趣)在指定的目录中生成一个新的文件名,使用指定的文件名前缀和后缀?

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

    5 回复  |  直到 15 年前
        1
  •  19
  •   Nate    15 年前

    要知道做错这件事是一个安全漏洞。有一些利用临时(ish)文件的技巧,这些技巧可以让管理员访问整个系统,而不仅仅是您的应用程序。见 this 给你一些建议。

    有几种方法:

    boost::filesystem 计划将成为C++ Tr2的一部分,它将在将来几乎所有编译器中得到支持。注意你必须 #define BOOST_FILESYSTEM_VERSION 3 ( info boost::文件系统 不支持 unique_path

        2
  •  2
  •   Justin Ethier    15 年前

    您可以生成一个UUID来创建唯一的名称。见 this link 用于C++中实现的列表。

        3
  •  1
  •   Scott Chamberlain    15 年前

    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;
    
        4
  •  0
  •   Thanatos    15 年前

    考虑到你的签名,这个函数是不可能完美实现的。对于文件系统,您经常会遇到竞争条件的问题:

    • 函数决定文件名“foobar”
    • 你的程序无法打开“foobar”,因为在第2步中有人击败了你。

    POSIX机器有一个绕过这一点的功能: mkstemp GetTempFileName ,更接近 mktemp ,但使用 CREATE_NEW CreateFile ,这将导致 创建文件 如果文件存在,则失败。从那里,您可以实现 mkstemp公司 .

        5
  •  0
  •   gabriel    12 年前

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