Eu tenho um nome de arquivo (C: \ pasta \ foo.txt) e preciso recuperar o nome da pasta (C: \ pasta) em C ++ não gerenciado. Em C #, eu faria algo assim:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
Existe uma função que pode ser usada em C ++ não gerenciado para extrair o caminho do nome do arquivo?
Usando Boost.Filesystem:
boost::filesystem::path p("C:\\folder\\foo.txt"); boost::filesystem::path dir = p.parent_path();
fonte
p.remove_filename()
modificaráp
no local e pode ser implementado com mais eficiência do quep = p.parent_path()
parent_path()
de"C:\\folder"
resultará em"C:"
.Exemplo de 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; }
fonte
Em C ++ 17 existe uma classe
std::filesystem::path
usando o métodoparent_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'; }
Resultado possível:
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"
fonte
.remove_filename()
método.Por que tem que ser tão complicado?
#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 }
fonte
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
Você pode precisar
p.parent_path().filename()
obter o nome da pasta pai.fonte
Use boost :: filesystem. Ele será incorporado ao próximo padrão de qualquer maneira, então você também pode se acostumar com ele.
fonte
_splitpath é uma boa solução CRT.
fonte
Estou tão surpreso que ninguém mencionou a forma padrão em Posix
Por favor, use
basename / dirname
construções.man basename
fonte
basname(char * path)
e nãobasename(const char * path)
), e as implementações que não fazem isso parecem ter que usar um buffer estático que os torna inseguros para thread (em princípio, você também pode retornar resultados alocados dinamicamente, mas isso o torna dependente dealloc
funções familiares, o que é estranho em C ++).O C ++ padrão não fará muito por você a esse respeito, pois os nomes de caminho são específicos da plataforma. Você pode analisar manualmente a string (como na resposta do código de luz), usar os recursos do sistema operacional (por exemplo, http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx ), ou provavelmente o melhor abordagem, você pode usar uma biblioteca de sistema de arquivos de terceiros como boost :: filesystem.
fonte
Basta usar este: ExtractFilePath (your_path_file_name)
fonte