c - 扫描目录中的文件时如何跳过文件
问题描述
我有一个列出目录中所有文件的程序。如果文件链接断开,我想跳过该文件并继续扫描文件中的其他文件。如果有人能指出我错的地方,我将不胜感激。以下是我的代码的一部分
d = opendir(".");
while((dir = readdir(d)) != NULL) {
char buff[256];
int target = readlink (dir->d_name, buff, sizeof(buff));
if (target == -1)
{
printf("i found broken link so continuing to next file..\n");
continue;
}
}
我遇到的问题是,它正在打印,而我只有一个断开的链接
i found broken link so continuing to next file
i found broken link so continuing to next file
i found broken link so continuing to next file
一直持续到最后一个文件。
解决方案
您的问题应该有一些MCVE。另请参阅inode(7)和symlink(7)。阅读Advanced Linux Programming或更新的内容。
考虑使用nftw(3)或fts(3)(如果您需要递归扫描子目录)或至少对文件路径执行stat(2)(因为您正在扫描当前目录,所以您不需要构造该文件路径)。请记住跳过和的.
条目..
;所以试试吧
d = opendir(".");
while((dir = readdir(d)) != NULL) {
struct stat mystat;
if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) continue;
memset (&mystat, 0, sizeof(mystat));
if (stat(dir->d_name, &mystat) || S_ISLNK(mystat.st_mode))
continue;
/// etc...
}
您可能想要处理许多情况。另请参见errno(3)。自我的符号链接呢?那么unix(7)套接字呢?fifo(7) -s? 权限?
(我们没有时间和空间来解释所有细节;您确实需要大量阅读)
推荐阅读
- css - 2个元素中的第一个是否有伪类选择器?
- c# - 我应该创建和重用 AmazonSimpleEmailServiceClient 作为单例吗?
- laravel - 清理表中的数据?
- java - Java:如何在没有 IF/SWITCH 的情况下从外部初始化枚举
- javascript - componentDidMount 清除表单中的值
- python - 无效的参数组合 - eq()
- aws-codebuild - 如何获取上传到 S3 的 AWS 代码构建工件的版本 ID?
- vue.js - Vue-native-script / 环境不工作
- datagrid - 如何在大型分页网格/表格上开发“检查全部”功能
- apache-spark - 透明流和批处理