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