|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
[C unix] file
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?? Codice:
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);
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il nome della direntry è sempre relativo alla directory che lo contiene. Devi aggiungerci il prefisso della directory.
Un semplice Codice:
if (stat(nomefile, &st)<0) perror(nomefile);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se sei su linux dovresti avere le manpage:
man fstatat
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:43.




















