C readdir忽略以点开头的非空存储库

C readdir忽略以点开头的非空存储库,c,linux,C,Linux,我正在编写一个dotfile存储库管理器,但是删除存储库的命令不起作用。 它进入存储库文件夹,然后它必须列出所有文件和目录,以便我能够删除它们。问题是,它列出了我需要删除的每个文件或目录,但它排除了非空的.git。我对其他存储库做了进一步的测试,我的结论是,每个名称以点开头的非空目录都会被忽略,而普通的点文件则可以。 下面是令人不快的代码,我将快速描述 使用存储库的名称调用rm_dotfiles_存储库,repo_dirrepo到达存储库,然后启动readdir循环。我需要递归删除文件夹,这就是

我正在编写一个dotfile存储库管理器,但是删除存储库的命令不起作用。 它进入存储库文件夹,然后它必须列出所有文件和目录,以便我能够删除它们。问题是,它列出了我需要删除的每个文件或目录,但它排除了非空的.git。我对其他存储库做了进一步的测试,我的结论是,每个名称以点开头的非空目录都会被忽略,而普通的点文件则可以。 下面是令人不快的代码,我将快速描述

使用存储库的名称调用rm_dotfiles_存储库,repo_dirrepo到达存储库,然后启动readdir循环。我需要递归删除文件夹,这就是为什么我在文件夹和普通旧文件之间进行过滤。请注意,我不排除文件夹。还有..,但我很快会补充

#define _XOPEN_SOURCE 500
#include "repository.h"
#include "helpers.h"
#include "nftwcallbacks.h"

#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <error.h>
void rm_dotfiles_repository(char* repo)
{
    repo_dir(repo);
    /* Remove the repository's files recursively
     * TODO: Remove the symbolic links in ~ before removing the repo
     * We remove the repository, target by target */
    DIR* dir = NULL;
    struct dirent* file = NULL;
    struct stat stat_data;
    dir = opendir(".");
    if (dir == NULL)
    {
        perror("Error:");
        exit(EXIT_FAILURE);
    }
    file = readdir(dir);
    while ((file = readdir(dir)) != NULL)
    {
        if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
        {
            /* TODO: why isn't .git listed, even if .gitmodules is listed ? After tests, it seems that .something repositories which are non-empty 
             * aren't listed*/
            if(stat(file->d_name, &stat_data))
            {
                perror("Error");
                exit(EXIT_FAILURE);
            }
            if (S_ISDIR(stat_data.st_mode))
            {
                remove_target(repo, file->d_name);
            }
            else
            {
                printf("Remove file %s\n", file->d_name);
            }
        }
    }
    if (closedir(dir))
    {
        perror("Error:");
        exit(EXIT_FAILURE);
    }
}

void install_target(char* repo, char* target)
{
    repo_dir(repo);
    if (nftw(target, install, 4, 0))
    {
        exit(EXIT_FAILURE);
    }
} 

void remove_target(char* repo, char* target)
{
    printf("Remove target %s from repo %s\n", target, repo);
} 
你能帮我找到问题的原因吗?提前谢谢


编辑:正如Mats Peterson所问,“这是完整的代码,我给出的代码片段是repository.c

您的代码跳过了目录中的第一个条目:

file = readdir(dir);
while ((file = readdir(dir)) != NULL)
移除

file = readdir(dir);

一切都会好起来的

您可以编写一个完整的独立示例,而不是包含大量非标准include文件的代码段。我有一个独立的例子,是的,但是有很多代码。我会做一个要点。嗯,我刚刚删除了我不需要它的代码,创建了一个名为.git的目录并运行你的代码,它说,在删除所有其他文件的中间,从RePO中删除目标。因此,仅有两种可能的情况是,您没有.git目录的读取权限,或者您的系统与我的系统之间存在一些差异……感谢您的回复,我拥有drwxr-xr-x权限,我是所有者。奇怪的我使用的是Arch Linux,所有软件包都是最新的。我的盒子是64位Fedora。如果你在一个空目录下运行你的代码,只有一个.git目录,它能工作吗?谢谢你的耐心,Mats。错误确实在键盘和椅子之间。。。PEBKAC