PDA

View Full Version : [C unix] file


stella_650
24-06-2008, 13:57
Buon pomeriggio a tutti,
ho bisogno di un aiutino per una prima parte di un programma in cui dopo aver ricercato l'estensione passata in input rispetto alla cartella il cui nome è sulla riga di comando, mi si chiede di verificare i diritti di lettura per altri e la dimensione.

Il problema è che cosi' come segue dal codice, in output non mi vengono calcolate bene le dimensioni (cioè mi esce sempre 0) e anche i permessi risultano sempre, cioè anche se da shell con chmod cambio il permesso, ottengo sempre lo stesso output...Qual è il problema allora??


int main(int argc, char *argv[])
{
DIR *dp;
struct stat st;
struct dirent *drn;
char nomefile[255];
int sizeminima=0;
if(argc!=3)
{
printf("Errore nell'utilizzo del programma <./Trova> <ext> <directory>\n");
exit(-1);
}
if((dp=opendir(argv[2]))!=NULL)
{
while((drn=readdir(dp))!=NULL)
{

if(strstr(drn->d_name,argv[1]))
{
printf("File %s\n",drn->d_name);
//Verificare i diritti di lettura per altri
strcpy(nomefile,drn->d_name);
stat(nomefile,&st);
if(st.st_mode & S_IROTH)
{
printf("Il file %s ha il permesso di lettura per altri\n",nomefile);
//stat(nomefile,&st);
//mi esce dimensione 0
printf("Il file %s ha dimensione %ld\n",nomefile,st.st_size);
}
}

}
}
closedir(dp);


}

Sarei grata per l'aiuto...grazie in anticipo

ilsensine
24-06-2008, 14:02
Il nome della direntry è sempre relativo alla directory che lo contiene. Devi aggiungerci il prefisso della directory.

Un semplice

if (stat(nomefile, &st)<0)
perror(nomefile);

ti avrebbe immediatamente indirizzato al problema.

stella_650
24-06-2008, 14:18
Il nome della direntry è sempre relativo alla directory che lo contiene. Devi aggiungerci il prefisso della directory.



Come...?

ilsensine
24-06-2008, 14:26
Come...?
snprintf(nomefile, sizeof(nomefile), "%s/%s", argv[2], drn->d_name);

Però c'è un modo migliore: fstatat. E' una funzione non standard, ma linux la dovrebbe avere.

stella_650
24-06-2008, 14:39
snprintf(nomefile, sizeof(nomefile), "%s/%s", argv[2], drn->d_name);

Però c'è un modo migliore: fstatat. E' una funzione non standard, ma linux la dovrebbe avere.

poikè non ho mai usato questa funzione, nel mio codice in che modo poi dovrei usarla?grazie

ilsensine
24-06-2008, 14:46
Se sei su linux dovresti avere le manpage:
man fstatat