stat()错误'readdir()返回文件名时'没有这样的文件或目录'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stat()错误'readdir()返回文件名时'没有这样的文件或目录'相关的知识,希望对你有一定的参考价值。

我无法识别统计信息引发的错误。下面的程序读取目录中的所有文件并打印文件名:

DIR *dp;
struct dirent *dirp;
struct stat sb;

if((dp = opendir(argv[1]))==NULL)
{
    perror("can't open dir");
}
while((dirp = readdir(dp))!=NULL)
{
    if (stat(dirp->d_name, &sb) == -1) {
        perror("stat");
    }   
    printf("File name:               %s 
",dirp->d_name);
}

样本输出:

/home/eipe
stat error: No such file or directory
File name:               copyofsample 
File name:               a.out 
File name:               . 
stat error: No such file or directory
File name:               udpclient.c 
File name:               .. 
stat error: No such file or directory
File name:               client.c 
stat error: No such file or directory
File name:               ftpclient.c 

这里是内容:

ls -l /home/eipe/c

-rwxr-xr-x 1 eipe egroup 7751 2011-02-24 15:18 a.out
-rw-r--r-- 1 eipe egroup  798 2011-02-24 13:50 client.c
-rw-r--r-- 1 eipe egroup   15 2011-02-24 15:34 copyofsample
-rw-r--r-- 1 eipe egroup 1795 2011-02-24 15:33 ftpclient.c
-rw-r--r-- 1 eipe egroup  929 2011-02-24 13:34 udpclient.c
答案

dirp->d_name是文件在目录中的名称:例如"udpclient.c"。因此,文件的全名是"/home/eipe/c/udpclient.c"-但是您的当前工​​作目录是/home/eipe,因此stat()试图访问"/home/eipe/udpclient.c",该名称不存在。

您可以使用argv[1]将工作目录更改为chdir(),也可以在调用argv[1]之前在每个文件名前附加stat()

另一答案

注意,POSIX 2008引入了fstatat()和相关功能(系统调用),所有这些功能都由fstatat()后缀区分为熟悉的功能名称。它还定义at以获取与目录流关联的文件描述符。

[dirfd()函数使用一个(或在dirfd()情况下为两个))打开文件描述符来引用目录。这意味着,在支持*at()的系统上,另一种编码方式是:

renameat()

使用fstatat()和相关功能,您可以使用相对路径名,而无需使用const char *name = argv[i]; DIR *dp = opendir(dirname); if (dp == NULL) { fprintf(stderr, "failed to open directory %s (%d: %s) ", name, errno, strerror(errno)); return -1; } int dfd = dirfd(dp); /* Very, very unlikely to fail */ struct dirent *dirp; while ((dirp = readdir(dp)) != NULL) { struct stat sb; if (fstatat(dfd, dirp->d_name, &sb, 0) == -1) { fprintf(stderr, "fstatat("%s/%s") failed (%d: %s) ", name, dirp->d_name, errno, strerror(errno)); } else printf("%-20s %s/%s ", "File name:", name, dirp->d_name); } (这很危险;不使用fstatat()很难回到开始的位置),或者将名称串联在一起显示在主菜单中接受的答案。对于可移植性,无论如何仍然建议使用串联连接-但我能够使用下面的代码在Mac OS X(10.10.1)和Linux(Ubuntu 14.04)上进行测试。

开发为完整程序(chdir()):

chdir()

样品运行:

fchdir()

以上是关于stat()错误'readdir()返回文件名时'没有这样的文件或目录'的主要内容,如果未能解决你的问题,请参考以下文章

使用 fs.readdir 和 fs.statSync 返回 ENOENT,没有这样的文件或目录错误

nodejs删除安卓手机指定文件

12 readdir 函数

新手求教readdir_r函数是啥意思?

Nodejs 检测指定目录下所有文件

Nodejs 检测指定目录下所有文件