首页 > 解决方案 > 扫描目录中的文件时如何跳过文件

问题描述

我有一个列出目录中所有文件的程序。如果文件链接断开,我想跳过该文件并继续扫描文件中的其他文件。如果有人能指出我错的地方,我将不胜感激。以下是我的代码的一部分

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

一直持续到最后一个文件。

标签: c

解决方案


您的问题应该有一些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? 权限?

(我们没有时间和空间来解释所有细节;您确实需要大量阅读)


推荐阅读