1

ls -RC言語でどのように実装されているか知りたいです。再帰アルゴリズムを使用していますか?

4

5 に答える 5

2

"ls" (at least the implementations that I know of) use fts_open, fts_read ... to traverse a file hierarchy. These are "non-recursive" methods which maintain a list of the visited directories internally.

Use "man fts_read" or http://linux.die.net/man/3/fts_read to get more information about these functions.

于 2012-10-22T06:46:27.413 に答える
2

関連するコードブロックは次のとおりです

<includes...>
int f_recursive;        /* ls subdirectories also */
while ((ch = getopt(argc, argv, "1ABCFLRSTWabcdfghiklmnopqrstuwx")) != -1) {
    switch (ch) {
.
.
.
.
case 'R':
    f_recursive = 1;
    break;

後で、上記のintフラグにより​​、ディレクトリの一覧表示が再帰的に行われます。

ここのソースを参照してください。

ディレクトリ. _ ._..

ただし、内部で再帰が行われているようには見えませんls.c。fts_children のようなfts-functionsを使用して階層をトラバースします。同じものを使用できます。

于 2012-10-22T06:36:57.020 に答える
2

完全を期すために、ls は GNU coreutils (www.gnu.org/software/coreutils/) の一部です。

于 2012-10-22T06:42:06.383 に答える
1

I think this would help you.

 void listDir(char *dirName)
 {
     DIR* dir;
     struct dirent *dirEntry;
     struct stat inode;
     char name[1000];
     dir = opendir(dirName);
     if (dir == 0) {
        perror ("Eroare deschidere fisier");
        exit(1);
     }
     while ((dirEntry=readdir(dir)) != 0) {
        sprintf(name,"%s/%s",dirName,dirEntry->d_name); 
        lstat (name, &inode);

        // test the type of file
        if (S_ISDIR(inode.st_mode))
           printf("dir ");
        else if (S_ISREG(inode.st_mode))
           printf ("fis ");
        else
          if (S_ISLNK(inode.st_mode))
            printf ("lnk ");
        else;
          printf(" %s\n", dirEntry->d_name);
  }
于 2012-10-22T06:45:39.643 に答える