PDA

View Full Version : [C] creare una lista dei file presenti in una directory


VendeR
01-07-2006, 13:48
ciao a tutti! allora come da titolo, vorrei sapere come posso fare in c una lista con tutti i file presenti in una cartella.. per la lista so benissimo come farla, mentre il mio problema sta proprio nei nomi dei file..
io in pratica voglio farmi un programma che rinonimi tutti i file presenti in una cartella con uno stesso formato. e quindi pensavo prima di creare una lista dinamica con tutti i nomi dei file, e poi utilizzando la funzione rename() rinominare tutti i file che non rispettano lo "standard" che interessa a me..
tanto che ci sono.. e se volessi che il programma vada a cercare in una ben definita cartella che gli passo da linea di comando, invece che cercare solo nella cartella in cui lancio il programma, come potrei fare? oppure per fargli analizzare tutti i file presenti in una cartella, ma anche nelle cartelle sottostanti??
grazie in anticipo :)

scorpion89
01-07-2006, 13:56
Appoggiarti ai comandi di sistema??
Nn so, parlando sotto *UNIX.
ls > file_presenti
Apri il file in C e poi hai i nomi li inserisci nella lista e fai tutto quello ke vuoi.
Può funzionare?

CIao

wisher
01-07-2006, 14:05
concordo, se invece usi windows puoi usare dir /B >elenco.txt

VendeR
01-07-2006, 17:59
cavolo non ci avevo proprio pensato :D :D :D
grazie per l'info!
solo per complicarmi la vita.. non c'è un modo per farlo fare al programma "dir /B >elenco.txt" (il programma che mi voglio fare per ora mi serve solo su sistemi win..) ??? cioè in modo che sia completamente automatico, io clicco sull'eseguibile e fa tutto lui :confused:
spero di non aver chiesto troppo... :rolleyes:

scorpion89
02-07-2006, 09:50
Allora se ho capito bene basta fare:

system("dir /B > elenco.txt");

Ciao

VendeR
02-07-2006, 23:53
thx :D

trallallero
03-07-2006, 09:01
se ti interessa saperlo fare in C senza dover fare system o dir
ti mando un esempio.

Ti stampa a video tutti i files (anche link,dir ...) che trova nella cartella
passata come argomento


#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>


void main( int argc, char **argv )
{
DIR *dirp = NULL;

struct dirent *dp;

dirp = opendir( argv[1] );

while (dirp)
{
errno = 0;

if ((dp = readdir(dirp)) != NULL)
{
puts(dp->d_name);
}
else
{
closedir(dirp);
dirp = NULL;
}
}
}


ciao :)

VendeR
04-07-2006, 13:28
se ti interessa saperlo fare in C senza dover fare system o dir
ti mando un esempio.

Ti stampa a video tutti i files (anche link,dir ...) che trova nella cartella
passata come argomento


#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>


void main( int argc, char **argv )
{
DIR *dirp = NULL;

struct dirent *dp;

dirp = opendir( argv[1] );

while (dirp)
{
errno = 0;

if ((dp = readdir(dirp)) != NULL)
{
puts(dp->d_name);
}
else
{
closedir(dirp);
dirp = NULL;
}
}
}


ciao :)

grazie mille per il codice! in effetti pensavo che ci fosse un modo meno "grezzo" che usare la system e redirigere l'output (cosa che però mi pare ben più semplice del codice che hai scritto..)
avrei da chiederti alcune cose riguardo il codice:
- struct dirent da che campi è formata?? c'è name che sarà il nome del file, ma gli altri campi?
- dirp = opendir( argv[1] ); cosa fa :confused: :confused:

il resto l'ho capito.. graize mille!

andbin
04-07-2006, 13:44
- struct dirent da che campi è formata?? c'è name che sarà il nome del file, ma gli altri campi?Secondo la documentazione su Linux (man 3 readdir):
According to POSIX, the dirent structure contains a field char d_name[] of unspecified size, with at most NAME_MAX characters preceding the terminating null character. Use of other fields will harm the portability of your programs. POSIX 1003.1-2001 also documents the field ino_t d_ino as an XSI extension.

- dirp = opendir( argv[1] ); cosa fa :confused: :confused:Apre lo "stream" della directory.

trallallero
04-07-2006, 13:46
- struct dirent da che campi è formata?? c'è name che sarà il nome del file, ma gli altri campi?

struct dirent
{
ino_t d_ino; /* "inode number" of entry */
off_t d_off; /* offset of disk directory entry */
unsigned short d_reclen; /* length of this record */
char d_name[1]; /* name of file */
};


- dirp = opendir( argv[1] ); cosa fa :confused: :confused:
dirp é una struttura di tipo DIR:

typedef struct
{
int dd_fd; /* file descriptor */
int dd_loc; /* offset in block */
int dd_size; /* amount of valid data */
char *dd_buf; /* directory block */
} DIR; /* stream data from opendir() */

opendir é una funzione che "apre" una directory in lettura
e restituisce l'informazione.
argv[1] é il primo parametro che passi all'eseguibile.
se hai un file di nome "pippo.exe" che stampa il primo
parametro a video, nel codice trovi:

printf( argv[1] );


il resto l'ho capito.. graize mille!
obligado :)

VendeR
04-07-2006, 14:00
ri-grazie :D
appena ho tempo provo, poi se ho qualche casino ti chiederò ancora :)
ciau :D