Domanda

Ho appena iniziato a studiare c ++ e attualmente sto usando i blocchi di codice. voglio scrivere un'applicazione in grado di cercare file nella directory inclusi i suoi sottodir, ma non riesco a trovare buoni esempi per questo e ho letto da qualche parte che questo è possibile solo attraverso una libreria come boost.

  1. è vero?
  2. qualche esempio per farlo senza libreria?

grazie in anticipo

È stato utile?

Soluzione

È anche possibile usarlo usando le chiamate di sistema del sistema operativo, ad esempio readdir su linux. boost (e altre librerie) ti permetterà di scrivere codice portatile per diversi (tutti?) sistemi operativi.

Qui puoi trovare esempi elaborati http: // faq .cprogramming.com / cgi-bin / smartfaq.cgi answer = 1046380353 & amp;? id = 1044780608

Altri suggerimenti

Sì, è vero: il C ++ standard non ha API per elencare il contenuto di una directory.

Quindi lo fai tramite una libreria (Boost o altri) o tramite le chiamate native per il sistema operativo che stai utilizzando (FindFirstFile / FindNextFile su Windows, opendir / readdir su Unix). Altre risposte hanno un codice di esempio.

Ma se hai appena iniziato a studiare il C ++ è probabilmente meglio non lottare con questi per ora. Concentrati sull'apprendimento del C ++ standard per l'inizio. Scrivere l'applicazione che avevi in ??mente è un esercizio utile ma lo rimanderei un po 'fino a quando non avrai più familiarità con il C ++ standard.

Boost non è l'unico modo di scansionare le directory, ma è probabilmente il modo più semplice per farlo in modo neutrale rispetto alla piattaforma, ovvero senza usare un'API specifica della piattaforma (come Win32).

Ecco un semplice esempio usando boost:

#include <boost/filesystem.hpp>
#include <iostream>
#include <iterator>
#include <set>

std::set<boost::filesystem::path> getDirContents (const std::string& dirName)
{
    std::set<boost::filesystem::path> paths;
    std::copy
        ( boost::filesystem::directory_iterator (dirName)
        , boost::filesystem::directory_iterator ()
        , std::inserter (paths, paths.end ())
        );

    return paths;
}

int main (int argc, char* argv[])
{
    std::set<boost::filesystem::path> paths = getDirContents ("C:\\");
    std::copy
        ( paths.begin ()
        , paths.end ()
        , std::ostream_iterator<boost::filesystem::path> (std::cout, "\n")
        );
    return 0;
}

Questo script viene utilizzato per raccogliere informazioni sulla data di creazione e modifica dei file dall'unità di sistema, possiamo cercare qualsiasi data per conoscere i risultati e tutto l'output verrà archiviato in un file semplice, quindi è più facile visualizzare il registro. Prima di eseguire questo programma, confermare l'autorizzazione di lettura / scrittura per il file flat di output (FileList.txt).

Aiuta a sapere quali sono tutti i file creati / aggiornati in quella data di ricerca. La maggior parte dei programmi malware tenta di iniettare / influenzare i file, quindi aiuta a eseguire il debug di quei file interessati. Ho scritto questo script usando la versione Borland C ++ 5.5 su piattaforma Windows.

Trova il codice sorgente dal mio blog tecnico - http://www.algonuts.info/how-to-trace-file-creation-and-modification-date-using-c-programming.html

#include<iostream.h>
#include<conio.h>
#include<dirent.h>
#include<dir.h>
#include<process.h>
#include<string.h>
#include<stdio.h>
#include<io.h>
#include<dos.h>
#include<sys/stat.h>

int found=0;
struct ffblk vfile;
unsigned long int udata;
char ch,present[MAXPATH];
int year,month,day;

int next_directory(char *);
void scan_directory(char *);

void main(int account,char *arg[],char *env[])
{   
    clrscr();
    getcwd(present,MAXPATH);

    DIR *dir; 
    struct dirent *temp;
    cout<<"\nWelcome to Finder for file view";
    cout<<"\n\nEnter drive:";
    cin>>ch;

    char base[]="X:\\";
    base[0]=ch;
    if ((dir = opendir(base)) == NULL)
    { 
        clrscr();
        cout<<"\nError : Derive not found";  
        getch(); 
        exit(0); 
    }
    else
    {
        if(access("FileList.txt",0)==0)
        unlink("FileList.txt");
        cout<<"\n\n\nScan Date Details:";
        cout<<"\n\nEnter Year:";
        cin>>year;
        cout<<"\nEnter Month:";
        cin>>month;
        if( !(month>=1 && month<=12) )
        {
            clrscr();
            cout<<"\nError:Value of month is not exist";
            getch();
            exit(0);                
        }
        cout<<"\nEnter Day:";
        cin>>day;
        if( !(day>=1 && day<=31) )
        {
            clrscr();
            cout<<"\nError:Value of day is not exist";
            getch();
            exit(0);                
        }
    }

    scan_directory(base);
    while ((temp = readdir(dir)) != NULL)
    {
        char  *directory = (char *) malloc(3+strlen(temp->d_name)+1);
        strcpy(directory,base);
        strcat(directory,temp->d_name);
        next_directory(directory);
        free(directory);
    }
    closedir(dir);

    clrscr();
    if(access("FileList.txt",0)==0)
    cout<<"\n\nSystem: Successfully Find all files and stored in FileList.txt";
    else
    cout<<"\n\nSystem: No file has Modified on"<<day<<"//"<<month<<"//"<<year;
    sleep(3);   
}

int next_directory(char *path)
{
    int count=0;
    DIR *dirtemp; 
    char *hold,*temp;
    struct dirent *ptemp;


    hold=path;
    if ((dirtemp = opendir(path)) != NULL)
    scan_directory(path);
    else
    return 0;


    while ((ptemp = readdir(dirtemp)) != NULL)
    {     
        char *directory = (char *) malloc(1+strlen(ptemp->d_name)+1);
        directory[0]='\\';
        strcpy(directory+1,ptemp->d_name);
        if(directory[1]!='\.')
        {
            count=strlen(hold);
            temp = (char *) malloc(strlen(hold)+strlen(directory)+1);
            strcpy(temp,hold);
            strcat(temp,directory);
            free(directory);
            if(opendir(temp)!=NULL)
            next_directory(temp); 
            temp[count]='\0'; 
            free(temp+count+1);
            hold=temp;
        }
        else
        free(directory);
    }
    closedir(dirtemp);
    return 0;
}

void scan_directory(char *tempo)
{
    cout<<"\n"<<tempo;

    FILE *stream;
    struct ftime ft;

    if(present[0]==tempo[0])
    chdir(tempo);  
    else
    {
        setdisk(tempo[0]-65);
        chdir(tempo); 
    }

    udata = findfirst("*.*",&vfile,0x02);
    while (!udata)
    {  
        stream = fopen(vfile.ff_name,"r");
        if(stream==NULL)
        {
            fclose(stream);
            udata=findnext(&vfile);
            continue;
        }
        else
        {
            getftime(fileno(stream), &ft);
            if(year==ft.ft_year+1980 && month==ft.ft_month && day==ft.ft_day)
            {
                //cout<<"\n"<<tempo<<" "<<vfile.ff_name<<"  Hour:"<<ft.ft_hour<<"  Min:"<<ft.ft_min<<"  Sec:"<<ft.ft_tsec *2;
                if(present[0]==tempo[0])    
                system("cd\\");
                chdir(present); 

                char string[25];
                FILE *fp = fopen("FileList.txt","a+");

                if(found==0)
                {
                    fputs("Scan Date: ",fp);
                    itoa(ft.ft_day, string, 10);
                    fputs(string,fp);
                    fputc('\\',fp);

                    itoa(ft.ft_month, string, 10);
                    fputs(string,fp);
                    fputc('\\',fp);

                    itoa((ft.ft_year+1980), string, 10);
                    fputs(string,fp);
                    fputs("\n\n",fp);
                    found=1;
                }

                unsigned get;
                _dos_getfileattr(vfile.ff_name,&get);
                if (get & _A_HIDDEN)
                fputs("[Hidden File]  ",fp);

                get=0;
                if(ft.ft_hour<10)
                get=1;
                itoa(ft.ft_hour, string, 10);
                fputs(string,fp);
                fputc('\\',fp);

                if(ft.ft_min<10)
                get=get+1;
                itoa(ft.ft_min, string, 10);
                fputs(string,fp);
                fputc('\\',fp);

                if(ft.ft_tsec<10)
                get=get+1;
                itoa(ft.ft_tsec, string, 10);
                fputs(string,fp);

                for(int count=0;count<get;count++)
                fputs(" ",fp);

                fputs("  ",fp);
                fputs(tempo,fp);
                fputs("   ",fp);

                fputs(vfile.ff_name,fp);
                fputc('\n',fp);
                fclose(fp);

                if(present[0]==tempo[0])
                chdir(tempo);  
                else
                {
                    setdisk(tempo[0]-65);
                    chdir(tempo); 
                }
            }
            fclose(stream);
        }
        udata=findnext(&vfile);
    }
    if(present[0]==tempo[0])    
    system("cd\\");
    chdir(present);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top