【发布时间】:2018-03-15 06:59:48
【问题描述】:
最终更新- 答案在已接受答案的 cmets 中。
首先,我意识到这个问题还有很多其他答案。我已经经历了其中的大部分,这段代码是经历了许多其他答案的组合。我要做的就是找到目录中每个文件的完整路径。
#include <limits.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
DIR *d;
struct dirent * dir;
char fullpath[PATH_MAX + 1];
d = opendir("/home/adirectory");
if(d != NULL)
{
while((dir = readdir(d)) != NULL)
{
realpath(dir->d_name, fullpath);
printf("[%s]\n", fullpath);
printf("%s\n", dir->d_name);
}
// addition of the following line yields
// Value too large for defined data type
perror("Something isn't working: ");
closedir(d);
}
return 0;
}
更新#3:
失败的调用是dir = readdir(d),这就是为什么我有 perror
紧接在 while 循环之后。
更新#2:
这在 CentOS 和 Ubuntu gcc 4.8.5 + 上运行良好。不工作 Solaris gcc 4.5.2。
更新: 有错误提示:
值对于定义的数据类型来说太大了
...但我不确定是什么原因造成的。
这总是只打印我正在从中运行程序的当前工作目录。即便如此,它实际上并没有列出该目录中除了“。”之外的任何文件。和 ”..” 。是什么赋予了?是否存在某种许可问题?这个解决方案在 2017 年不起作用吗?
【问题讨论】:
-
我按原样编译并运行了它,它对我来说很好用。您是否拥有
/home/adirectory的读取和执行权限?试试cd /home/adirectory看看你能不能做ls并得到结果。 -
在 Linux 上对我来说没问题。我确实将目录更改为我的主目录。
-
我不应该只需要读取权限吗?
-
您没有显示对来自
realpath()的返回值的任何检查;它可能会失败,所以你应该检查会发生什么。 -
看起来像
realpath失败,测试返回值和errno对ENOMEM或ENAMETOOLONG。