+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Cercare delle cartelle e dei file

  1. #1
    gl_malinverni non è in linea Scolaretto
    Post
    58

    Cercare delle cartelle e dei file

    Ciao a tutti, ho un problema che non riesco a risolvere.

    Ho un file in formato testo contenente una lista di nomi, la lista può variare, da 1 a 40000.
    I nomi corrispondono a delle cartelle contenenti n file (il numero e il nomi dei file non sono fissi).
    Io dovrei individuare, se presente, la cartella indicata nel file e copiare gli n file presenti nella cartella, in un'altra directory.

    Il mio problema consiste nel fatto che non riesco a trovare il modo corretto per passare il percorso della cartella alla funzione FindFirstFile.



    codice:
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char *campoc (FILE*);
    void cerca_file(char *);
    
    int main(void) {
    
    // **************************** Campi del file **************************************
    	
    	char *CODE;
    	
    // ************************** Variabili di sistema ************************************
    	
    	FILE *fr;	// file in lettura
    	char *fileread = "C:\\Ellipse\\Mattonelle\\Obbligatorie.txt"; 
    
    	fopen_s(&fr, fileread, "r");
    	while (!feof(fr)) {
    		CODE = campoc(fr);
    		
    		cerca_file(CODE);
    	
    				
    	
    		free(CODE);
    		
    		
    		
    	}
    	fclose(fr);
    	return 0;
    
    }
    
    		
    
    void cerca_file(char CODE) {
         WIN32_FIND_DATA FindFileData;
         HANDLE hFind;
         char DirPath[70];
     
         sprintf(DirPath, "C:\\Ellipse\\Mattonelle\\Case\\%s", CODE);
         hFind = FindFirstFile(DirPath, &FindFileData);
         if (hFind == INVALID_HANDLE_VALUE) {
              printf ("FindFirstFile failed (%d)\n", GetLastError());
         
          } else {
              printf ("FindFirstFile ok \n");
          
          }
       
          FindClose(hFind);
    
          return;
    }


    Ho capito che l'errore è la formattazione del DirPath ma non riesco a capire come risolverlo.


    La funzione campoc(fr) fornisce il nome della cartella andandola a cercare nel file

    Grazie a tutti per l'aiuto

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,210
    Blogs
    5
    Mostra un esempio del file in questione, ovviamente con pochi dati.

    Non ho capito se devi cercare su TUTTO il disco OGNI cartella ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    gl_malinverni non è in linea Scolaretto
    Post
    58
    Prima di tutto grazie per la risposta.

    Questo è un estratto del file testo

    codice:
    INF670110861727000001861
    INF660110052986000001052
    INF670110393477000001393
    INF670110700937000002700
    INF690110741569000002741
    INF690110867219000002867
    INF690110403849000002403
    INF660110406226000003406
    INF660110406216000003406
    INF660110406186000003406
    INF660110513636000003513
    INF660110513626000003513
    INF660110066996000003066
    INF660110141126000003141
    INF670110853037000003853
    INF690110342189000004342
    INF690110560189000004560
    INF660110560296000004560
    INF660110149936000005149
    INF660110790966000005790
    INF660110150236000005150
    INF660110588696000005588
    INF680110606028000006606
    INF660AVE0528260ZITAX052
    INF660AVE0529260ZITAF052
    INF660AVE0529460ZITAD052
    INF660AVE0529560ZITAD052
    INF660AVE0529760ZITAC052
    INF660AVE5554660ZITAR555

    In pratica ho una cartella chiamata "Case", all'interno di questa cartella ho 54000 sotto cartelle con nomi simili a quelli riportati nell'estratto del file.
    All'interno di queste sotto cartelle ci sono dei file, come dicevo il numero e il nome di questi file non sono fissi.

    Ad esempio: Io devo cercare la cartella "INF670110861727000001861" dichiarata nella prima riga del file, all'interno della directory "Case" e copiare tutti i suoi file in un'altra cartella di nome "C:\Ellipse\Mattonelle\Obbligatorie"

    Per il momento mi sono fermato alla ricerca dei file


    Mi sono accorto ora, che ho inserito il percorso errato.

    Riporto il codice modificato:



    codice:
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char *campoc (FILE*);
    void cerca_file(char *);
    
    int main(void) {
    
    // **************************** Campi del file ********************************************************
    	
    	char *CODE;
    	
    	// **************************************** Variabili di sistema ************************************
    	
    	FILE *fr;	// file in lettura
    	char *fileread = "C:\\Ellipse\\Mattonelle\\Obbligatorie.txt";
    
    	fopen_s(&fr, fileread, "r");
    	while (!feof(fr)) {	
    		CODE = campoc(fr);
    		
    		cerca_file(CODE);
    	
    		free(CODE);
    		
    	}
    	fclose(fr);
    	return 0;
    
    }
    
    
    void cerca_file(char *CODE) {
          WIN32_FIND_DATA FindFileData;
          HANDLE hFind;
          char DirPath[70];
     
          sprintf(DirPath, "C:\\Ellipse\\Mattonelle\\Case\\%s\\*.*", CODE);
          hFind = FindFirstFile(DirPath, &FindFileData);
          if (hFind == INVALID_HANDLE_VALUE) {
             printf ("FindFirstFile failed (%d)\n", GetLastError());
          } else {
             printf ("FindFirstFile ok \n");
         }
       
         FindClose(hFind);
    
         return;
     }


    Grazie

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,210
    Blogs
    5
    Quindi non devi cercare nulla perché i percorsi li conosci. Una volta creato il percorso

    \Case\INF670110861727000001861

    prendi tutti i file e li copi nell'altra cartella?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  5. #5
    gl_malinverni non è in linea Scolaretto
    Post
    58
    Il mio problema è proprio questo, non gli piace come creo il percorso.
    Ho creato una cartella di prova con il nome riportato nella prima riga e ho inserito un file, ma non mi trova nulla.

    Il programma gira, ma mi da una segnalazione di errore nella funzione FindFirstFile sulla variabile DirPhat:

    char DirPath[70]

    Error: argument of type "char *" is incompatible with parameter of type "LPCWSTR"

    Non capisco come risolverlo

  6. #6
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,210
    Blogs
    5
    Con cosa stai compilando? Stai usando Unicode?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  7. #7
    gl_malinverni non è in linea Scolaretto
    Post
    58
    Sto utilizzando Microsoft Visual Studio 2010 Professional

  8. #8
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,210
    Blogs
    5
    Ok, quindi devi configurare (proprietà progetto) non per usare il set Unicode ma Multibyte
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  9. #9
    gl_malinverni non è in linea Scolaretto
    Post
    58
    Stavo scrivendo questo, mentre tu mi hai risposto...


    Se modifico il programma in questo modo funziona benissimo:

    codice:
    void cerca_file(char *CODE) {
       WIN32_FIND_DATA FindFileData;
       HANDLE hFind;
      
       TCHAR szDirPath[] = TEXT("C:\\Ellipse\\Mattonelle\\Case\\INF670110861727000001861\\*.*");
     
      
       hFind = FindFirstFile(szDirPath, &FindFileData);
       if (hFind == INVALID_HANDLE_VALUE) {
          printf ("FindFirstFile failed (%d)\n", GetLastError());
         
       } else {
           printf ("FindFirstFile ok \n");
          
       }
       
       FindClose(hFind);
    
       return;
     }
    Solo che io non so a prescindere il nome della cartella da cui copiare i file e quando tento di unire il percorso con il nome ricavato dal file testo, smette di funzionare.


    Posso provare la soluzione da te suggerita, ma non ho capito esattamente cosa devo fare e molto probabilmente non lo so fare.
    Potresti darmi qualche indicazione in più?

  10. #10
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,210
    Blogs
    5
    Funziona perché vuoi lavorare in Unicode. In questo caso cambia così

    codice:
    void cerca_file(TCHAR *CODE) {
    e

    codice:
    	TCHAR szDirPath[MAX_PATH];
    	
    	swprintf(szDirPath, MAX_PATH, TEXT("C:\\Ellipse\\Mattonelle\\Case\\%s\\*.*"), CODE);
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi