代码之家  ›  专栏  ›  技术社区  ›  Apocalisp

从文件名中获取目录名

  •  71
  • Apocalisp  · 技术社区  · 15 年前

    我有一个文件名(c:\文件夹\fo.txt),我需要检索非托管C++中的文件夹名(c:\文件夹)。在C中,我会这样做:

    string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
    

    在非托管C++中是否有一个函数可以从文件名中提取路径?

    11 回复  |  直到 7 年前
        1
  •  24
  •   IInspectable    9 年前

    这有一个标准的Windows功能, PathRemoveFileSpec . 如果您只支持Windows 8及更高版本,强烈建议您使用 PathCchRemoveFileSpec 相反。除其他改进外,它不再局限于 MAX_PATH (260)字符。

        2
  •  137
  •   Khaled Alshaya    15 年前

    使用boost.filesystem:

    boost::filesystem::path p("C:\\folder\\foo.txt");
    boost::filesystem::path dir = p.parent_path();
    
        3
  •  60
  •   corsiKa    15 年前

    例子来自 http://www.cplusplus.com/reference/string/string/find_last_of/

    // string::find_last_of
    #include <iostream>
    #include <string>
    using namespace std;
    
    void SplitFilename (const string& str)
    {
      size_t found;
      cout << "Splitting: " << str << endl;
      found=str.find_last_of("/\\");
      cout << " folder: " << str.substr(0,found) << endl;
      cout << " file: " << str.substr(found+1) << endl;
    }
    
    int main ()
    {
      string str1 ("/usr/bin/man");
      string str2 ("c:\\windows\\winhelp.exe");
    
      SplitFilename (str1);
      SplitFilename (str2);
    
      return 0;
    }
    
        4
  •  19
  •   Zitrax dudico    7 年前

    在C++ 17中存在一个类 std::filesystem::path 使用该方法 parent_path .

    #include <iostream>
    #include <filesystem>
    namespace fs = std::filesystem;
    int main()
    {
        for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."})
            std::cout << "The parent path of " << p
                      << " is " << p.parent_path() << '\n';
    }
    

    可能的输出:

    The parent path of "/var/tmp/example.txt" is "/var/tmp"
    The parent path of "/" is ""
    The parent path of "/var/tmp/." is "/var/tmp"
    
        5
  •  10
  •   toster-cx    9 年前

    为什么要这么复杂?

    #include <windows.h>
    
    int main(int argc, char** argv)         // argv[0] = C:\dev\test.exe
    {
        char *p = strrchr(argv[0], '\\');
        if(p) p[0] = 0;
    
        printf(argv[0]);                    // argv[0] = C:\dev
    }
    
        6
  •  5
  •   Edward Strange    15 年前

    使用boost::filesystem。不管怎样,它都会被纳入下一个标准,所以你也可以习惯它。

        7
  •  2
  •   Ofek Shilon    15 年前

    _splitpath 是一个很好的CRT解决方案。

        8
  •  2
  •   srbcheema1 Feu    7 年前
     auto p = boost::filesystem::path("test/folder/file.txt");
     std::cout << p.parent_path() << '\n';             // test/folder
     std::cout << p.parent_path().filename() << '\n';  // folder
     std::cout << p.filename() << '\n';                // file.txt
    

    你可能需要 p.parent_path().filename() 获取父文件夹的名称。

        9
  •  1
  •   Utkarsh Kumar    8 年前

    我很惊讶没有人在posix中提到标准的方法

    请使用 basename / dirname 构造。

    人的名字

        10
  •  -1
  •   Cogwheel    15 年前

    在这方面,标准C++对你没有多大帮助,因为路径名是特定于平台的。您可以手动解析字符串(如在glowcoder的答案中),使用操作系统工具(例如 http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx 或者可能是最好的方法,您可以使用第三方文件系统库,如boost::filesystem。

        11
  •  -4
  •   fxPiotr    10 年前

    只需使用这个:extractfilepath(您的\u路径\u文件名)