Estou tentando usar std::filesystem::current_path()
para alterar o diretório de trabalho para algo que pode ser um symlink. Se o alvo for um symlink, o link está sendo resolvido e o diretório de trabalho se torna o alvo do link em vez do caminho que especifiquei. Meu principal problema com isso é que ele torna os caminhos relativos incorretos.
Como exemplo:
#include <filesystem>
#include <iostream>
using namespace std;
using namespace std::filesystem;
auto main(int, char **) -> int {
// create absolute directory then symlink to it
create_directory("/tmp/tgt");
create_directory_symlink("/tmp/tgt", "/tmp/dir");
cout << "cwd0: " << current_path() << '\n';
current_path("/tmp/dir");
cout << "cwd1: " << current_path() << '\n';
remove("/tmp/tgt");
remove("/tmp/dir");
return 0;
}
Executando isso de dentro do /tmp
diretório, a saída é.
cwd0: "/tmp"
cwd1: "/tmp/tgt"
mas o que eu quero é cwd1
mostrar/tmp/dir
Existe um mecanismo portátil para alterar o diretório de trabalho para um link simbólico?
std::filesystem::current_path()
"Altera o diretório de trabalho atual para p, como se fosse POSIXchdir
", echdir()
segue links simbólicos. Não há opção na biblioteca padrão para evitar isso.Seu diretório de trabalho tem que ser um diretório . Um symlink não é um diretório. Então não, esse recurso não existe.
Por outro lado, os shells frequentemente emulam esse comportamento. Por exemplo, no bash, se você fizer
você acaba voltando para
/tmp
, não para/some/other
. A explicação é que issocd ..
não acontecechdir("..")
(o que colocaria você/some/other
exatamente pelo motivo que você declarou). Em vez disso, o shell usa uma variável interna para manter o controle do diretório atual "lógico", com base na sequência decd
comandos anteriores, e calcular qual deve ser o novo diretório de trabalho com base nisso.Então, se você quiser um comportamento como esse, você terá que emulá-lo você mesmo, assim como os shells fazem. Não é algo que o SO fornece para você.