web-dev-qa-db-ja.com

Cを使用してディレクトリを開く

コマンドライン入力を介してパスを受け入れています。

私がする時

dir=opendir(args[1]);

ループに入りません...つまりdir==null...

コマンドライン入力をdirポインタに渡すにはどうすればよいですか?

void main(int c,char **args)
{
    DIR *dir;
    struct dirent *dent;
    char buffer[50];
    strcpy(buffer, args[1]);
    dir = opendir(buffer);   //this part
    if(dir!=NULL)
    {
        while((dent=readdir(dir))!=NULL)
            printf(dent->d_name);
    }
    close(dir);
}

./a.out  /root/TEST is used to run the program..
./a.out --> to execute the program
/root/TEST --> input by the user i.e valid path
14
Vinod K

あなたは本当にあなたのコードを投稿すべきですが、ここに行きます。皮切りに:

_    #include <stdio.h>
    #include <dirent.h>

    int main (int c, char *v[]) {
        struct dirent *pDirent;
        DIR *pDir;

        if (c < 2) {
            printf ("Usage: testprog <dirname>\n");
            return 1;
        }
        pDir = opendir (v[1]);
        if (pDir == NULL) {
            printf ("Cannot open directory '%s'\n", v[1]);
            return 1;
        }

        while ((pDirent = readdir(pDir)) != NULL) {
            printf ("[%s]\n", pDirent->d_name);
        }
        closedir (pDir);
        return 0;
    }
_

_args[1]_が設定されており、実際のディレクトリを参照していることを確認する必要があります。これを実行する場合:

_testprog tmp
_

tmpは現在のディレクトリのサブディレクトリですが、任意の有効なディレクトリを使用できます)、次のようになります:

_[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
_

file)ではなく、directoryを渡す必要があることに注意してください:

_testprog tmp/file1.txt
_

私は得る:

_Cannot open directory 'tmp/file1.txt'
_

これはディレクトリではなくファイルであるためです(巧妙な場合は、最初のdiropenが失敗するとdiropen(dirname(v[1]))を使用できます)。

39
paxdiablo

Cプログラム実行可能ファイルに渡されるパラメーターは文字列(または文字ポインター)の配列に過ぎないため、プログラムがこれらのパラメーターにアクセスする前にこれらの入力パラメーターにメモリが既に割り当てられているため、バッファーを割り当てる必要はありません。プログラム内のエラー処理コードも避けてください(segfaultの可能性を減らします:))。

2
Anil Vishnoi

コードの一部に関するフィードバック。ただし、ほとんどの部分で機能するはずです...

_void main(int c,char **args)
_
  • _int main_-標準では、mainを返すものとしてintを定義しています。
  • cおよびargsは通常、argcおよびargvという名前が付けられますが、任意の名前を付けることができます

...

_{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
_
  • ここにバッファオーバーフローがあります:_args[1]_が50バイトより長い場合、bufferはそれを保持できず、メモリに書き込むべきではありません。ここにバッファをコピーする理由はないので、strcpy...を使用しないだけでこれらの問題を回避できます。

...

_dir=opendir(buffer);   //this part
_

これがNULLを返す場合、いくつかの理由が考えられます。

  • ディレクトリが存在しませんでした。 (正しく入力しましたか?その中にスペースがあり、opendir("my")を試みるので失敗します_./your_program my directory_と入力しました)
  • ディレクトリへのアクセス権がありません
  • メモリが不足しています。 (これはほとんどありません。)
2
Thanatos

lsを使用してcコマンドを実装する簡単な方法を次に示します。たとえば./xls /tmp

    #include<stdio.h>
    #include <dirent.h>
    void main(int argc,char *argv[])
    {
   DIR *dir;
   struct dirent *dent;
   dir = opendir(argv[1]);   

   if(dir!=NULL)
      {
   while((dent=readdir(dir))!=NULL)
                    {
        if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
            {
            }
       else
              {
        printf(dent->d_name);
        printf("\n");
              }
                    }
       }
       close(dir);
     }
0
Vijay S B