Obter Directório de Correntes em C++

Jinku Hu 12 outubro 2023
  1. Utilize a função getcwd para obter o directório actual
  2. Utilize a função std::filesystem::current_path para obter o directório actual
  3. Utilize a função get_current_dir_name para obter o directório actual
Obter Directório de Correntes em C++

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"
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C++ Filesystem