我有一个文件名(C:\ folder \ foo.txt),我需要在非托管C ++中检索文件夹名称(C:\ folder)。在C#中,我将执行以下操作:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
有没有可以在非托管C ++中使用的函数来从文件名中提取路径?
我有一个文件名(C:\ folder \ foo.txt),我需要在非托管C ++中检索文件夹名称(C:\ folder)。在C#中,我将执行以下操作:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
有没有可以在非托管C ++中使用的函数来从文件名中提取路径?
Answers:
为此,有一个标准的Windows函数PathRemoveFileSpec。如果仅支持Windows 8和更高版本,则强烈建议改用PathCchRemoveFileSpec。除其他改进外,它不再限于MAX_PATH
(260)个字符。
使用Boost.Filesystem:
boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
parent_path()
from"C:\\folder"
会导致的事实"C:"
。
来自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;
}
在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"
.remove_filename()
方法。
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()
获取父文件夹的名称。
使用boost :: filesystem。无论如何,它将被合并到下一个标准中,因此您也可以习惯它。
_splitpath是一个不错的CRT解决方案。
我很惊讶没有人提到Posix中的标准方法
请使用basename / dirname
构造。
男人的基名
basname(char * path)
不是basename(const char * path)
),而没有执行该实现的实现似乎必须使用静态缓冲区,这会使它们成为线程不安全的(原则上您也可以返回动态分配的结果,但这使您依赖alloc
于C ++中尴尬的族函数。
在这方面,标准C ++对您没有多大帮助,因为路径名是特定于平台的。您可以手动解析字符串(如glowcoder的回答),使用操作系统工具(例如http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx),或者可能是最好的方法是,您可以使用第三方文件系统库,例如boost :: filesystem。