PDA

Visualizza la versione completa : [C] Scansione directory per cercare file


Daisyland
18-03-2011, 12:42
Voglio effettuare una scansione di varie directory per trovare dei file, ad esempio tutti i file .txt.
Ho provato questo codice, trovato in rete, che poi adatterei, ma mi da' errore

[Linker error] undefined reference to `alphasort'
[Linker error] undefined reference to `scandir'


int scandir(const char *pathname, struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));

int alphasort(const struct dirent **a, const struct dirent **b);


struct dirent **namelist;
int number;

number = scandir(".", &namelist, 0, alphasort);
if (number < 0)
perror("scandir");
else
while(number--) printf("%s\n", namelist[n]->d_name);

YuYevon
18-03-2011, 15:44
Sistema? Compilatore?

Daisyland
18-03-2011, 18:40
sto facendo su windows vista (ma penso sia indifferente, intendo rispetto agli altri windows) con dev c++
Forse chiedi del sistema perche' va inserito qualche richiamo al dos ?

YuYevon
18-03-2011, 20:25
Quelle due funzioni derivano dallo standard BSD 4.3 e sono state poi introdotte nello standard POSIX:2008, ma il Dev (o meglio, la vecchia versione del compilatore mingw e relative librerie che ha il Dev visto che il progetto è morto da 5-6 anni almeno) non supporta nulla di tutto ciò. Visto che sei su Windows ti consiglio di ricorrere all'API di sisema per la gestione di file (http://msdn.microsoft.com/en-us/library/aa364232%28v=VS.85%29.aspx) e directory (http://msdn.microsoft.com/en-us/library/aa363950%28v=VS.85%29.aspx); se il Dev rompe anche con quelle, ti consiglio di buttarlo via senza pensarci (e sarebbe solo uno dei tanti motivi per farlo) e di passare a qualcosa di più moderno come al Visual C++ se lavori su Windows (o al gcc se hai la possibilità di lavorare su Linux dato che, almeno con le versioni più recenti, le due funzioni oggetto del thread sono tranquillamente utilizzabili).

Daisyland
18-03-2011, 21:08
si' ma non vedo le funzioni che mi servono.
ma possibile che non esistano funzioni simili a quella che ho messo per fare la scansione di una directory ?

shodan
18-03-2011, 21:22
Si è possibile. A rigor di logica, il C/C++ non è tenuto a sapere se esiste un filesystem sottostante (e parecchia altra roba dire il vero), pertanto ogni interrogazione in merito va fatta al sistema operativo. Posix prevede quelle funzioni, Windows altre, altri sistemi operativi non Posix altre ancora e così via. Sta a te usare quelle appropriate in base al sistema operativo sottostante.

Daisyland
18-03-2011, 21:28
Tra l'altro ho provato a mettere il codice


DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);

con l'include Windows.h e mi dice

syntax error before "DWORD"

shodan
18-03-2011, 21:35
Non so cosa tu abbia fatto, ma la funzione andrebbe usata così (per esempio e ammesso che non sia settato UNICODE).


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main () {

char myDir[MAX_PATH];
memset(myDir,0,MAX_PATH);
GetCurrentDirectory(MAX_PATH,myDir);
puts(myDir);
}

Daisyland
18-03-2011, 21:50
niente, era un errore su un include, l'ho visto dopo.
Ora mi resta da individuare la funzione per trovare i file nella directory

MacApp
19-03-2011, 00:19
Originariamente inviato da Daisyland
niente, era un errore su un include, l'ho visto dopo.
Ora mi resta da individuare la funzione per trovare i file nella directory
FindFirstFile (http://msdn.microsoft.com/en-us/library/aa364418(v=vs.85).aspx) et simila

Loading