У меня есть имя файла (C:\folder\foo.txt), и я должен получить имя папки (C:\folder) в неуправляемом C++. В C# я сделал бы что-то вроде этого:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
Существует ли функция, которая может использоваться в неуправляемом C++ для извлечения пути из имени файла?
Для этого есть стандартная функция Windows, PathRemoveFileSpec . Если вы поддерживаете только Windows 8 и новее, настоятельно рекомендуется использовать вместо него PathCchRemoveFileSpec . Среди других улучшений, он больше не ограничен MAX_PATH
(260) символами.
Использовать boost :: filesystem. В любом случае он будет включен в следующий стандарт, так что вы можете к нему привыкнуть.
Использование Boost.Filesystem:
boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
Пример из 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 ++ мало что вам даст в этом отношении, поскольку имена путей зависят от платформы. Вы можете вручную проанализировать строку (как в ответе светового кодера), используя средства операционной системы (например, http://msdn.microsoft.com/en-us/library/aa364232 (v = VS.85) .aspx ]), или, вероятно, лучший подход, вы можете использовать стороннюю библиотеку файловой системы, например boost :: filesystem.