模仿ansi C中的ls

发布于 2024-12-09 21:07:55 字数 708 浏览 0 评论 0原文

我有一个代码可以模仿 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);

I have a code to mimic ls -la in ansi C, but when I change the directory from . (current directory) to any other it keep saying No such file or directory, any ideas why?

code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

铁憨憨 2024-12-16 21:07:55

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

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

You need to concatenate the directory path and the file name.

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

Use s(n)printf or something like that:

sprintf(fullpath, "%s/%s", dirpath, mydirent->d_name);
stat(fullpath, &st);
蓬勃野心 2024-12-16 21:07:55

问题是,正如@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);

使用 fstatatpathname 是相对于目录句柄的,您可以将 pathname 直接指向 struct dirent.d_name.

The problem is, as already stated by @cnicutar, that stat wants the filename in the form dir/file. The problems are:

  • The / may not work on every operating system.
  • You need to allocate memory for the composed string, do overflow checks ...

If you don't insist on ANSI and can live with POSIX instead, then you can try fstatat and dirfd:

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

With fstatat the pathname is relative to the directory handle and you can point pathname directly to struct dirent.d_name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文