Jump to content

Leer y manejar directorios con c


Recommended Posts

Ya, este pequeño tuto se los dejo para los que quieran aprender un poco de la programación en Linux, ya que en este aspecto hay muchas diferencias con Windows. Usaremos sólo funcones estándar o pseudoestándar para nuestros propósitos.

 

En este ejemplo que hice, buscaremos todos los archivos finalizados en .db en un directorio que nos pasan como argumento y los eliminaremos.

 

//incluiremos algunas librerías

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <dirent.h>

#include <sys/types.h>

#include <stddef.h>

#include <unistd.h>

 

//la dirent es la librería que contiene funciones útiles para el manejo de directorio, y es la que usaremos.

//las funciones que implementaremos en el programa son las que siguen:

 

//dibujamos un menu en caso que no hayan o haya más de un argumento

void menu();

//Encontrar la extensión de un archivo

char* find_ext(char *);

//borrar el archivo con extensión .ext

int remove_file(char *, char *, char *);

//buscar archivos

void search_db(char *);

//Por cuestión de comodidad el menu no lo pondremos y nos iremos directo a las funciones que nos interesan:

 

//En el main ejecutamos el menu en caso que nos pasen un número distinto de argumentos que 1

//en el caso que sea 1, nos correos un espacio en la matriz y le pasamos la cadena que contiene el directorio a buscar a la funcion search_db

 

int main(int argc, char** argv)

{

if (argc!=2) menu();

else if (argc==2){

argv++;

search_db(*argv);

}

return 0;

}

 

 

//Encontremos la extensión, recibimos una cadena, y buscamos hasta el final, luego desde el final nos vamos corriendo hasta encontrar

//el último punto... todo esto muy entretenido de programar :)

 

char* find_ext(char *file)

{

int flag=0;

char point[1];

 

for(;*(file+1);file++);

for(;*(file);file--){

point[0]=file[0];

if(strcmp(point,".")==0) {

flag=1;

break;

}

}

 

if (flag==1)

return file;

//si el archivo posee extensión retornamos la extensión (ej: music.mp3 devuelve .mp3)

else return NULL;

//si el archivo no tiene extensión retornamos NULL

}

 

 

//Ahora implementamos la función que elimina un archivo, le pasamos el directorio, el nombre de archivo y su extensión

 

int remove_file(char *direc, char *file, char *ext)

{

int flag;

char *archive;

archive=(char*)malloc(sizeof(char)*(strlen(direc)+strlen(file)));

strcpy(archive,direc);

strcat(archive,"/");

strcat(archive,file);

 

//concatenamos para poder tener la dirección del archivo completa

 

//si la extensión es .db, eliminamos el archivo con unlink

if (strcmp(ext,".db")==0){

flag=unlink((const char*)archive);

if (flag==1){

printf("\nERROR: couldn't remove %s , have you the super cow power?\n", archive);

return 0;

}

else {

printf("\n%s was deleted", archive);

return 1;

}

}

else return 0;

}

 

//Ahora la función mas importante, la explicaré paso a paso

 

 

void search_db(char *direc)

{

 

printf("\n\nSearching on %s", direc);

//declaramos un dato del tipo DIR

DIR *buff;

//y una estructura de tipo dirent

 

/*esta estructura posee varios miembros, pueden googlear para ver cuales son todos, pero nosotros usaremos 2, d_name y d_type

d_name es obvio lo que hace, pero d_type no tanto. d_type especifica el tipo de archivo que se tiene, si es 8, entonces es un archivo,

si es 6, es una carpeta*/

struct dirent *list;

 

//acá ocupamos el buffer de tipo DIR que habíamos ocupado antes, y abrimos el directorio que nos pasaron con la funcion opendir

buff=opendir(direc);

char *ext;

int cont=0;

//si el directorio existe

if (buff != NULL){

//este while dara falso si no se encuentran más archivos

//readdir nos devolverá un archivo o carpeta perteneciente al directorio en el que estamos buscando

while (list = readdir(buff)){

//si el archivo es del tipo 8 (archivo, no directorio), le buscamos la extensión

if (list->d_type == 8){

ext=find_ext(list->d_name);

//si la extensión existe, removemos el archivo, pero a la vez vamos aumentando un contador para saber cuantos archivos eliminamos

//recordar que remove_file devolvía 1 o 0

if(ext!=NULL){

cont = cont + remove_file(direc, list->d_name, ext);

}

}

}

//cerramos el directorio, esto es muy importante no olvidarlo

(void) closedir (buff);

}

else

perror ("Couldn't open the directory");

printf ("\nFiles deleted: %d\n", cont);

}

 

//y ese es nuestro programa, pueden seguir investigando usando google o su manual del programador de linux para mayores detalles

 

pueden descargar el archivo con menu y todo funcional acá:

 

http://www.box.net/shared/fl6lm6i8ma

 

saludos :)

Edited by EL_H4K
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...