Obter Directório de Correntes em C++
-
Utilize a função
getcwd
para obter o directório actual -
Utilize a função
std::filesystem::current_path
para obter o directório actual -
Utilize a função
get_current_dir_name
para obter o directório actual
Este artigo irá explicar vários métodos de como obter o directório actual em C++.
Utilize a função getcwd
para obter o directório actual
A getcwd
é uma função compatível com POSIX, disponível em muitos sistemas baseados em Unix, e pode recuperar o directório de trabalho actual. A função toma dois parâmetros - o primeiro char*
buffer onde o caminho do directório é armazenado e o tamanho do buffer. Note-se que estamos a declarar a matriz de comprimento fixo char
e a atribuir um buffer de 256 elementos, como um exemplo arbitrário. Se a chamada for bem sucedida, o nome armazenado do directório actual pode ser impresso ao aceder ao buffer char
.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char tmp[256];
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;
return EXIT_SUCCESS;
}
Resultado:
Current working directory: /tmp/projects
Utilize a função std::filesystem::current_path
para obter o directório actual
O método std::filesystem::current_path
faz parte da biblioteca do sistema de ficheiros C++ e é a forma recomendada de recuperar o directório actual através das modernas directrizes de codificação. Note-se que a biblioteca filesystem
foi adicionada após a versão C++17 e a versão correspondente do compilador é necessária para trabalhar com o seguinte código.
O std::filesystem::current_path
sem quaisquer argumentos devolve o directório de trabalho actual e pode ser directamente enviado para a consola. Se o caminho do directório for passado para a função, este muda o directório actual para o caminho dado.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
cout << "Current working directory: " << current_path() << endl;
return EXIT_SUCCESS;
}
Resultado:
Current working directory: /tmp/projects
Utilize a função get_current_dir_name
para obter o directório actual
O get_current_dir_name
é a função da biblioteca C que é semelhante ao método anterior, excepto que retorna o char*
onde o caminho do directório de trabalho actual é armazenado após uma chamada bem sucedida. A função get_current_dir_name
atribui automaticamente memória dinâmica suficiente para que o caminho seja armazenado, mas o chamador é responsável por libertar a memória antes da saída do programa.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char *cwd = get_current_dir_name();
cout << "Current working directory: " << cwd << endl;
free(cwd);
return EXIT_SUCCESS;
}
Resultado:
Current working directory: /tmp/projects
Outra funcionalidade útil da biblioteca do sistema de ficheiros C++ é o objecto std::filesystem::directory_iterator
, que pode ser utilizado para iterar através dos elementos de um determinado caminho de directório. Note-se que os elementos podem ser ficheiros, links simbólicos, directórios, ou tomadas, e a sua ordem de iteração não está especificada. No exemplo que se segue, produzimos o caminho de cada elemento do directório de trabalho actual.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
using std::filesystem::directory_iterator;
int main() {
for (auto& p : directory_iterator("./")) cout << p.path() << '\n';
return EXIT_SUCCESS;
}
Resultado:
"./main.cpp"
"./a.out"
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook