escanear un directorio para encontrar archivos en c

4 minutos de lectura

avatar de usuario
AleMal

Estoy tratando de crear una función en c que escanea toda mi ruta C: \ temp (Windows) para buscar un archivo que paso (por ejemplo, test.txt) y cada vez que encuentra uno devuelve la ruta a los pasos otra función para escribir algo en la parte inferior de este archivo. Logré hacer la función que escribe en el archivo, pero no puedo averiguar cómo escanear la carpeta y pasar la dirección del archivo encontrado.

  • Si también desea verificar las extensiones de archivo, scandir () puede ser útil stackoverflow.com/questions/22886290/…

    – Serguéi Ponomarev

    5 de julio de 2020 a las 20:15

avatar de usuario
Akhil Thayyil

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
void printdir(char *dir, int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    if((dp = opendir(dir)) == NULL) {
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)) {
            /* Found a directory, but ignore . and .. */
            if(strcmp(".",entry->d_name) == 0 ||
                strcmp("..",entry->d_name) == 0)
                continue;
            printf("%*s%s/\n",depth,"",entry->d_name);
            /* Recurse at a new indent level */
            printdir(entry->d_name,depth+4);
        }
        else printf("%*s%s\n",depth,"",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}

int main()
{
    printf("Directory scan of /home:\n");
    printdir("/home",0);
    printf("done.\n");
    exit(0);
}

  • … pero donde inserto mi ruta de escaneo de ventana como “c:\tools” y luego el archivo txt que quiero encontrar y modificar como “test.txt” y luego la cadena que quiero insertar al final como ” Algún texto”?

    – AleMal

    16 de noviembre de 2011 a las 10:22

  • pasar el nombre del directorio en la función printdir(“c:/xxx/xx/”,0); Modifique el código según su necesidad, este código enumerará todos los elementos en un directorio determinado

    – Akhil Thayyil

    16 de noviembre de 2011 a las 10:25

  • He modificado así para encontrar archivos llamados Filter.txt en el directorio LOG y escribo “hecho” al final del archivo… pero no funciona int main(){ printf(“Exploración del directorio de /home:\n” ); printdir(“C:/REGISTRO/Filtro.txt”,0); printf(“hecho.\n”); salir(0);}

    – AleMal

    16 de noviembre de 2011 a las 10:39

  • int main() { printf(“Exploración del directorio de /home:\n”); printdir(“C:/REGISTRO/Filtro.txt”,0); printf(“hecho.\n”); salir(0); }

    – Akhil Thayyil

    16 de noviembre de 2011 a las 11:38

  • Tenga en cuenta que mientras chdir(dir); esta bien, el final chdir(".."); no es una solución general al problema de ‘cambiar el directorio al lugar de donde vino’. Creo que solo funciona cuando el directorio con nombre es un subdirectorio inmediato del directorio actual. En los sistemas POSIX, puede utilizar fchdir() para cambiar de directorio de forma segura: int cwd = open(".", O_RDONLY); abre el directorio actual antes de hacer el inicial chdir()luego fchdir(cwd) vuelve a cambiar a ese directorio, seguido de close(cwd) por supuesto.

    –Jonathan Leffler

    1 de agosto de 2014 a las 6:00

Utilizar BuscarPrimerArchivo función. Aquí está un buen ejemplo de esta función usando.

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/dir.h>
#include<dirent.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
void searchInDirectory(char *dirname){
    DIR *dir;
    struct dirent *dirp;
    dir=opendir(dirname);
    chdir(dirname);
    while((dirp=readdir(dir))!=NULL){
        if(dirp->d_type==4){
            if(strcmp(dirp->d_name, ".")==0 || strcmp(dirp->d_name, "..")==0){
                continue;
            }
            printf("%s %s\n", "FOLDER", dirp->d_name);
            searchInDirectory(dirp->d_name);
        }
        else{
            printf("%s %s\n", "FILE", dirp->d_name);
        }
    }
    chdir("..");
    closedir(dir);
}
int main(){
    searchInDirectory(".");
    return 0;
}

  • Las publicaciones de solo código generalmente están mal vistas porque no brindan una explicación al interrogador en qué se diferencia su respuesta de cualquiera de las otras respuestas dadas o qué características adicionales proporciona su código que otros no. Recuerde, al responder una pregunta, asume el papel de “maestro”. Pasar el código sin comentar hace poco para educar (incluso si es correcto). Si el usuario estaba teniendo problemas con opendir/readdir es poco probable que resuelva sus problemas simplemente brindándoles lo que tienen nuevamente. Eres un usuario nuevo, así que no hay problema por hacerlo esta vez, pero agrega una explicación aquí.

    –David C. Rankin

    7 de noviembre de 2018 a las 8:27


  • Supongo que la otra respuesta tiene las mismas deficiencias: no la use como ejemplo de una buena respuesta.

    –David C. Rankin

    7 de noviembre de 2018 a las 8:31

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad