2017-06-28 16 views
1

私はLinuxにC++プログラムを書いています。私は現在のディレクトリを変更する必要があります。私はそれを変更したいディレクトリの名前を持っており、chdir()を使用したいと思います。しかし、引数はパスです(つまり、ディレクトリ位置を含むchar *)。私は完全な道を持っていませんが、ディレクトリの名前だけです。C++その名前が与えられたディレクトリへのパス

私はこの質問を見てきました:Changing the current directory in Linux using C++

はしかし、私は提案された解決策は、新しいディレクトリがカレントディレクトリのサブディレクトリである場合にのみ機能することを考えて - そう、それは私のために意味がありません。私のコンピュータに同じ名前の別のディレクトリがある場合は(私が間違っている場合は教えてください)。私はSubsirectoryにカレントディレクトリを変更したい場合は

私opitnionで
-CurrentDirectory 
    | 
    - Subdirectory 
    | 
    - ... etc. 
- AnotherDirectory 

chdir(Subdirectory.c_str())が働くだろう:

は私が明確だかどうかわからないんだけど、確かに、ここでは一例です。しかし、chdir(AnotherDirectory.str())ではありません(CurrentDirectoryとは何も共通していません)。 私はこの質問がすでにどこかで答えられなければならないことを知っていますが、私はそれを見つけることができません。

ありがとうございました!

まず
+3

今後のC++ 17標準の標準ライブラリの 'boost :: filesystem'や新機能を確認してください。 –

+0

[chdir](http://man7.org/linux/man-pages/man2/chdir.2.html) "現在の作業ディレクトリは相対パス名( '/'で始まっていないもの)を解釈するための出発点です。 "最初の絶対パスは '/'、 '../'は上に行く、 '../../'は2つ上がるなど – crashmstr

+4

どのディレクトリを変更するのかはどうやって知りますか?その情報はどこから来たのですか?相対パスかそれに対する絶対パスのいずれかがあります。そうでなければ、同じ名前の別の場所にある何千ものディレクトリのいずれかに関連した名前があります。 – Galik

答えて

0

、あなたが同じ名前を共有する(さまざまなディレクトリ内)いくつかののサブディレクトリを持っているかもしれません(あなたがa/xx/b/c/xx/の両方を持つことができます)

あなたは、ファイルツリーで何かを見つけるためにnftw(3)を使用することができますし、 getcwd(2)現在のディレクトリを取得します。また は(glob(3)ことrealpath(3)

お知らせの使用を検討し、いくつかの「標準的な」パスを取得し、その後

1つのディレクトリをスキャン(と stat(2)に渡される完全なパスを構築)する opendir(3)readdir(3)closedir(3)を使用して検討することもでき glob(7)も参照してください)、 fnmatch(3)wordexp(3)も役に立ちます。

+0

非常に明確かつ直接的な応答をありがとう。私はgetcwdとrealpathを知っていましたが、nftw(3)はわかりませんでした。それは私が探していたものです。これは私を助けた! – kilpikonna

+0

@kilpikonna「それは私が探していたものだ」と誤解されているか、デザインが完全に壊れている。 –

2

getcwdを使用すると、現在のディレクトリの絶対パス名を取得できます。

#include <unistd.h> 

char * getcwd(char *buf, size_t bufsize); 

は、あなたが他のdirerctoryへの絶対パス、またはそのようなことは、あなたが「検索」したいように思える../someotherdirectory

0

としてそれに対する相対パスのどちらかを知る必要がある、別のディレクトリに変更するにはディレクトリ名の場合私はこのためにlocateデータベースを使用することをお勧めします。コマンドラインで試すことができます。

locate AnotherDirectory 

これは、インデックスが作成されたローカルディスク上のすべてのファイルとディレクトリを出力します。

このディレクトリを探す場所がわからない場合は、このデータベースを使用するとパフォーマンスが大幅に向上する可能性があります。基礎ファイルの入手先についてはhttps://serverfault.com/questions/454127/where-is-the-updatedb-database-locatedですが、popen()を使用してlocateプログラムを実行すると、データベースファイルを直接読み込むよりも移植性の高いソリューションが得られます。

もちろん、同じ名前の複数のディレクトリを処理するアプリケーションロジックを作成する必要があります。

+0

この場合、プロセスをフォークすることは意味をなさないと思います。 [Nftw(3)](http://man7.org/linux/man-pages/man3/nftw.3.html)より関連性が高い可能性があります –

+0

@BasileStarynkevitch:DBを直接読むことができます。 。しかし、多くのディレクトリを移動することを意味するなら、 'nftw()'の解決法は大好きではありません。 DBソリューションは索引付けされたルックアップに過ぎず、大規模なファイルシステムを使用した方が効率的です。 –

関連する問題