我有一个代码来模仿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);
答案 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,那么您可以尝试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
。