Рекурсивно удалять висячие ссылки из каталога - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь удалить все висячие ссылки из dir Рекурсивно, но на каждой ссылке я получаю «lstat: Нет такого файла или каталога».

void deletelinks(char *name, int indent)
{
    DIR *dir;
    FILE *a;
    struct stat sb;
    char *buf;
    ssize_t nbytes, bufsiz;
    struct dirent *entry;

    if (!(dir = opendir(name)))
        return;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            char path[1024];
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;
            snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
           // printf("%*s[%s]\n", indent, "", entry->d_name);
            deletelinks(path, indent + 2);
        } else {
            if(entry->d_type == DT_LNK){
                if (lstat(("%s/%s", name, entry->d_name), &sb) == -1) {
                printf("%s/%s", name, entry->d_name);
               perror("lstat");
               exit(EXIT_FAILURE);
           }
           bufsiz = sb.st_size + 1;
           if (sb.st_size == 0)
               bufsiz = PATH_MAX;

           buf = malloc(bufsiz);
           if (buf == NULL) {
               perror("malloc");
               exit(EXIT_FAILURE);
           }

           nbytes = readlink(("%s%s", name, entry->d_name), buf, bufsiz);
           if (nbytes == -1) {
               perror("readlink");
               exit(EXIT_FAILURE);
           }
                a=fopen(("%s/%*s",name, (int) nbytes, buf), "r");
                if(a==NULL){

                    printf("%s/%*s\n",name, (int) nbytes, buf);
                  }
            }
        }
    }
    closedir(dir);
}

Я хочу, чтобы эта функция удаляла все висячие илинеработающие ссылки в директ.Этот функционал успешно находит все ссылки рекурсивно, но не может распознать, если он зависает или нет, потому что у меня ошибка "lstat: Нет такого файла или каталога"

1 Ответ

0 голосов
/ 18 июня 2019
void deletelinks(char *name, int indent)
{
    DIR *dir;
    FILE *a;
    struct stat sb;
    char *buf;
    ssize_t nbytes, bufsiz;
    struct dirent *entry;

    if (!(dir = opendir(name)))         
        return;

    while ((entry = readdir(dir)) != NULL) {            
        if (entry->d_type == DT_DIR) {                  
            char path[1024];
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;
            snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
           // printf("%*s[%s]\n", indent, "", entry->d_name);
            deletelinks(path, indent + 2);              
        } else {
            if(entry->d_type == DT_LNK){                
              char path[1024];
                snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
                if (lstat(path, &sb) == -1) {
                printf("%s", path);
               perror("lstat");
               exit(EXIT_FAILURE);
           }
           bufsiz = sb.st_size + 1;
           if (sb.st_size == 0)
               bufsiz = PATH_MAX;

           buf = malloc(bufsiz);
           if (buf == NULL) {
               perror("malloc");
               exit(EXIT_FAILURE);
           }

           nbytes = readlink(path, buf, bufsiz);
           if (nbytes == -1) {
               perror("readlink");
               exit(EXIT_FAILURE);
           }
                char path2[1024];
                snprintf(path2, sizeof(path2), "%s/%*s", name, (int) nbytes, buf);  
                a=fopen(path2, "r");                                                
                if(a==NULL){
                  fclose(a);
                  if(unlink(path)!=0) printf("error on deleting symlink!\n"); 
                  printf("%s\n", path);                                       
                  }
            }
        }
    }
    closedir(dir);          
}

получил, спасибо пользователю 3386109

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...