Подражая ls в ansi C - PullRequest
       4

Подражая ls в ansi C

1 голос
/ 14 октября 2011

У меня есть код для имитации ls -la в ansi C, но когда я меняю каталог с. (текущий каталог) любому другому, который он продолжает говорить Нет такого файла или каталога, есть идеи, почему?

код:

DIR * mydir;
struct dirent * mydirent;
struct stat st;
char outstr[100];
struct tm *tmp;
mydir = opendir("..");
while ((mydirent=readdir(mydir))!=NULL)
  if ( stat(mydirent->d_name,&st) != -1 ) {
    tmp = localtime(&st.st_mtime);
    if (tmp == NULL)
      perror("localtime ERROR: ");
    else {
      strftime(outstr, sizeof(outstr), "%d/%m/%Y", tmp);
      printf("%o\t%d\t%d\t%d\t%d\t%s\t%s\n",
    st.st_mode, st.st_nlink, st.st_uid, st.st_gid, 
    st.st_size, outstr, mydirent->d_name);
    }
  } 
  else 
    perror("stat ERROR: ");
closedir(mydir);

Ответы [ 2 ]

6 голосов
/ 14 октября 2011

Вам необходимо объединить путь к каталогу и имя файла.

stat(mydirent->d_name,&st) /* d_name is just the name, not the full path. */

Использовать s(n)printf или что-то в этом роде:

sprintf(fullpath, "%s/%s", dirpath, mydirent->d_name);
stat(fullpath, &st);
0 голосов
/ 14 октября 2011

Проблема, как уже говорилось @cnicutar, в том, что stat хочет имя файла в форме dir/file.Проблемы:

  • / может работать не на всех операционных системах.
  • Вам необходимо выделить память для составленной строки, выполнить проверки переполнения ...

Если вы не настаиваете на ANSI и можете вместо этого жить с POSIX, тогда вы можете попробовать fstatat и dirfd:

int dirfd(DIR *dirp);    // convert DIR * from opendir() to dirhandle
int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags);

С fstatat pathnameотносительно дескриптора каталога, и вы можете указать pathname непосредственно на struct dirent.d_name.

...