从文件名中获取目录名称

时间:2010-06-18 17:02:45

标签: c++ file directory

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

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

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

11 个答案:

答案 0 :(得分:141)

使用Boost.Filesystem:

boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();

答案 1 :(得分:61)

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

答案 2 :(得分:23)

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

答案 3 :(得分:20)

在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"

答案 4 :(得分:10)

为什么它必须如此复杂?

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

答案 5 :(得分:5)

使用boost :: filesystem。无论如何它将被纳入下一个标准,所以你也可以习惯它。

答案 6 :(得分:2)

_splitpath是一个不错的CRT解决方案。

答案 7 :(得分:2)

 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()来获取父文件夹的名称。

答案 8 :(得分:0)

我很惊讶没有人提到过Posix的标准方法

请使用basename / dirname构造。

man basename

答案 9 :(得分:-1)

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

答案 10 :(得分:-5)

使用它:ExtractFilePath(your_path_file_name)