ls -R
C言語でどのように実装されているか知りたいです。再帰アルゴリズムを使用していますか?
5 に答える
"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.
関連するコードブロックは次のとおりです
<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を使用して階層をトラバースします。同じものを使用できます。
完全を期すために、ls は GNU coreutils (www.gnu.org/software/coreutils/) の一部です。
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);
}