View Full Version : [C Unix] ricerca file
stella_650
23-06-2008, 09:16
Ciao a tutti, avrei bisogno di un piccolo aiuto per un problema di ricerca di un file con estensione .txt nella directory corrente su cui l'utente abbia diritti di scrittura.
Sono arrivata al punto in cui dopo aver esplorato la cartella corrente devo ricercare questo file...in che modo si specifica che tra quelli che vengono letti voglio quello di cui sopra?
PORZIONE DI CODICE:
struct stat st;
char *buf;
DIR *dp;
struct dirent *drn;
char nomefile[255],cwd[100];
//Mi posiziono nella directory corrente
getcwd(cwd,sizeof(cwd));
//Esploro il contenuto della directory
if((dp=opendir(cwd))==NULL)
{
printf("OPENDIR ERROR\n");
exit(-1);
}
while((drn=readdir(dp))!=NULL)
{
//printf("%s\n",drn->d_name);
stat(drn->d_name,&st);
//come specifico la ricerca di .txt con permesso di scrittura??
}
closedir(dp);
return 1;
}
Grazie a priori...ciao
ilsensine
23-06-2008, 09:50
Per il controllo dell'estensione, devi fare tu un filtro che le ricerchi in quanto non esistono primitive per l'estrazione dell'estensione (poiché non hanno alcun significato particolare sui sistemi unix). Volendo essere bravi, potresti definire la regular expression e usare le funzioni regex, ma il tuo problema è così semplice che puoi anche fare direttamente.
Per i controlli sul permesso in scrittura, ti consiglio di usare la (molto più sbrigativa di stat) funzione access (v. man access.).
Per fare tutto ciò, invece di iterare direttamente con opendir/readdir, potresti considerare l'uso di scandir, fornendo la funzione di filtro da te realizzata.
stella_650
23-06-2008, 10:22
Grazie per i suggerimenti:)
DanieleC88
23-06-2008, 10:42
Un'alternativa poi sarebbe questa:
http://hostautomata.com/software/man/3/fts
utilizzi la funzione strstr in string.h
strstr(drn->d_name,",.txt");
all'interno del ciclo while quando scorri la directory
con un controllo if ti accerti sel il file in questione contiene la sottostringa .txt
poi per il controllo dei permessi c'è il campo st_mode della struct stat
che con un and bit a bit con una costante per verivicare i diritti su quel file
man 2 stat elenca tutte le cstanti per verificare i diritti sui file
DanieleC88
23-06-2008, 11:45
E se il file si chiama inganno.txt.mp3? :p
Comunque, per i permessi ha risposto ilsensine, con access probabilmente si evita di stat-are ogni file.
ilsensine
23-06-2008, 11:45
utilizzi la funzione strstr in string.h
strstr(drn->d_name,",.txt");
No. Così becchi anche file del tipo "a.txt.bak"
Invece è meglio usare, ora che ci penso, fnmatch, che accetta i caratteri jolly:
if (fnmatch("*.txt", filename, 0)==0) {
/* match */
}
stella_650
23-06-2008, 14:43
utilizzi la funzione strstr in string.h
strstr(drn->d_name,",.txt");
all'interno del ciclo while quando scorri la directory
con un controllo if ti accerti sel il file in questione contiene la sottostringa .txt
poi per il controllo dei permessi c'è il campo st_mode della struct stat
che con un and bit a bit con una costante per verivicare i diritti su quel file
man 2 stat elenca tutte le cstanti per verificare i diritti sui file
Ho utilizzato questa strada perchè si avvicina di più alle cose trattate anche se fnmatch, vedendola, è migliore per quel tipo di ricerca
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.