2016-11-26 40 views
2

dirent.hを使用する方法を学んでいます。このプロセスは魅力的で興味深いものですが、私はd_nameの使用に問題があります。C++ dirent.hと絶対パスを取得するための構文

d_nameを使用して2つのことを行いたいとします。

  1. サブディレクトリを再帰的に検索します。私はDT_DIRタイプのファイルに遭遇したとき、これに、私は新しいのchar * FilePathパラメーターとしてディレクトリのd_nameを使用して自身の内部機能

    void iterateDirectory(char* filePath){ 
    DIR* dirPtr; 
    dirent* entry; 
    entry = readdir(dirPtr); 
    ... 
    } 
    

    に再帰呼び出しを行います。したがって、

    if(dirEntry->d_type == DT_DIR){ 
    entry->d_name; 
    iterateDirectory(entry->d_name); 
    ... 
    } 
    
  2. ディレクトリ内のすべてのファイルを開きます。これを行うには、DT_REGファイルが出現すると、ifstreamオブジェクトを作成し、d_nameを使用してファイルを開きます。だから、

    if(dirEntry->d_type == DT_REG){ 
    entry->d_name; 
    ifstream fin(entry->d_name); 
    if(fin.is_open) 
        cout<<"Opened"<<endl; 
    else 
        cout<<"Not Opened"<<endl; 
    ... 
    } 
    

私はに実行しています問題は、ボイドiterateDirectory()関数もはifstreamフィン()もないということは、有効な入力として、エントリー・> d_nameを認識するように思われます。 d_nameを使用してiterate関数を呼び出すか、ifstreamをentry-> d_nameで使用すると、ディレクトリまたはファイルが開いているかどうかを確認するのに失敗します。私はさまざまなchar *入力で正確に同じ関数をチェックしたので、関数自体は動作しています。私が考えることができる唯一の問題は、関数がパラメータとして絶対パスを取っていないことです。

私の質問はどのようにして、指定されたファイルまたはサブディレクトリの反復の時点での絶対パスを見つけることができるかです。私の初期の解決策は、 "。"を利用することでした。これは現在のディレクトリです。 "。"のアドレスを格納します。文字列に追加し、 "\" + entry-> d_nameを追加します。しかし、私は構文が間違っていると思う。

絶対パスの問題については正しいですか?または私は行方不明の別の問題がありますか?それが絶対パスの問題である場合、ファイルの絶対パスを取得するための構文は何ですか?

P.S.

私は過去に質問のスタックオーバーフローにアップロードするコードの量を最小限に抑えるために知らされていました。私は、必要最小限のコードであることを示しました。上記の情報が不十分な場合は、コードのgithubページをリンクしています。

https://github.com/ForeverABoy/dirent.h_practice/blob/master/directoryIterator.cpp

任意およびすべてが評価されてのに役立ちます。ありがとうございました!

+0

'd_name'はディレクトリ内のファイルの名前です。 "foo/bar"の* filePath *をopendir()し、 'd_name'を" baz "とすると、そのファイルを開くためには明らかに" foo/bar/baz "を開く必要があります。あなたは 'd_name'に何を表示しますか? –

+0

サム、 ありがとうございました。私は問題が絶対パスであることを認識し、与えられた入力からディレクトリの絶対パスを取得する方法を見つけ出そうとしています。 1. realpathは私に入力ディレクトリの代わりに自分のコードのビルドディレクトリを与えるので、realpath(entry-> d_name、buffer)を使うのはあまり役に立ちませんでした。 2.ファイルビルドディレクトリであっても、サブディレクトリのアドレスは更新されません。 fooからfoo/barへ行くと、bazを検索するとき、realpath()はfoo/bar/bazの代わりに私にfoo/bazを与えます。 –

+1

***ディレクトリ名***に 'realpath()'を使用して、ディレクトリへの絶対パスを取得します。次に、 'd_name'を追加します。 –

答えて

0

Sam Varshavchikのおかげで、私は問題を理解しました。

実際には、フルパス名を使用して関数を呼び出さないという問題がありました。私はこれを知ってすぐにrealpath()で修正しようとしました。問題は、ディレクトリ名ではなくエントリ - > d_nameでrealpathを使用していたことです。

realpath(entry->d_name, buffer); 

これは、入力ディレクトリの代わりにビルドディレクトリを返しました。私は、コードを実行している間、変数d_nameからのパスは確かにビルドディレクトリにあると仮定します。

char* fullPath = realpath(inputPath, buffer); 

これにより、入力した実際のパスがわかります。そこから、パスを文字列に変換し、ディレクトリまたはファイルに遭遇したときにパスを追加しました。

おかげさまで、サム。あなたが正しいです。 realpath()のマニュアルが何を言っているのかをよく読んで理解すると、それはすべて意味がありました。

関連する問題