模仿ansi C中的ls

时间:2011-10-14 15:06:29

标签: c linux ls

我有一个代码来模仿ansi C中的 ls -la ,但是当我更改目录时。 (当前目录)对任何其他人说它没有这样的文件或目录,任何想法为什么?

代码:

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 个答案:

答案 0 :(得分:6)

您需要连接目录路径和文件名。

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);

答案 1 :(得分:0)

正如@cnicutar所说,问题是stat想要dir/file形式的文件名。问题是:

  • /可能无法在每个操作系统上运行。
  • 您需要为组合字符串分配内存,执行溢出检查...

如果您不坚持ANSI并且可以使用POSIX,那么您可以尝试fstatatdirfd

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