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()返回文件名时'没有这样的文件或目录'的主要内容,如果未能解决你的问题,请参考以下文章