我正在編寫一個dotfile存儲庫管理器,但刪除存儲庫的命令不起作用。 它進入存儲庫文件夾,然後它必須列出所有文件和目錄,以便我可以刪除它們。麻煩在於,它列出了我需要刪除的每個文件或目錄,但它排除了非空的.git
。我對其他存儲庫進行了進一步測試,結論是,每個非空目錄的名稱以點開頭都會被忽略,而「普通」點文件則可以。 下面是我會很快描述的有問題的代碼。readdir忽略以點開頭的非空存儲庫
rm_dotfiles_repository時調用庫的名稱,repo_dir(repo)
獲取到存儲庫,然後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);
}
你能幫我找到問題的原因嗎?在此先感謝
編輯:由於墊皮特森問:here的完整代碼,我已經給段是repository.c
任何機會,你可以寫一個完整的獨立的例子,而不是一個包含很多包含非標準文件的代碼片段。例如它應該有一個「主」。 –
我有一個獨立的例子,是的,但有很多代碼。儘管如此,我會做一個主意。 – Mathuin
嗯,我只是刪除了代碼中的「我不需要它」,創建了一個名爲'.git'的目錄並運行了你的代碼,它說,在「刪除」所有其他文件的過程中,「從回購中刪除目標.git「。所以只有兩種可能的情況是你沒有'.git'目錄的讀權限,或者你的系統和我的系統有一些區別...... –