Frage

Ich habe gerade angefangen c ++ zu lernen und bin derzeit mit Codeblöcken. ich möchte eine Anwendung schreiben, die für Dateien im Verzeichnis suchen kann es subdirs einschließlich, aber ich kann keine gute Beispiele dafür zu finden scheinen, und ich habe irgendwo gelesen, dass dies durch eine Bibliothek wie boost nur möglich ist.

  1. ist das wahr?
  2. keine Beispiele, es zu tun, ohne Bibliothek?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Es ist auch möglich, es zu benutzen OS Systemaufrufe verwenden, readdir auf Linux zum Beispiel. steigern (und andere Bibliotheken) ermöglichen es Ihnen, portablen Code für mehr (alle?) OSes schreiben zu können.

Hier können u aufwendige Beispiele finden http: // faq .cprogramming.com / cgi-bin / smartfaq.cgi? answer = 1046380353 & id = 1044780608

Andere Tipps

Ja, es ist wahr:. Standard C ++ nicht über APIs für die Auflistung des Inhalts eines Verzeichnisses

So können Sie entweder tun es über eine Bibliothek (Boost-oder andere) oder durch die einheimischen Anrufe für das Betriebssystem Sie verwenden (Findfirstfile / Findnextfile unter Windows, opendir / readdir unter Unix). Andere Antworten haben Beispiel-Code.

Aber wenn Sie gerade erst begonnen Lernen C ++ ist es wahrscheinlich besser, nicht für jetzt mit diesen zu kämpfen. Konzentrieren Sie sich auf das Lernen Standard C ++ für den Anfang. Das Schreiben der Anwendung, die Sie im Sinn hatte, ist eine nützliche Übung, aber ich würde es ein wenig verschieben, bis Sie sind besser vertraut mit Standard-C ++.

Boost ist nicht die einzige Möglichkeit des Scannens Verzeichnisses, aber es ist wahrscheinlich der einfachste Weg, um es in einer plattformneutrale Art und Weise zu tun - d. H ohne eine plattformspezifische API (wie Win32) mit

Hier ist ein einfaches Beispiel mit 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;
}

Dieses Skript verwendet wird, um Dateien Erstellungs- und Änderungsdatum Informationen von Ihrem Systemlaufwerk zu sammeln, können wir ein beliebiges Datum zu suchen, die Ergebnisse zu kennen und alle Ausgaben werden in einer flachen Datei gespeichert werden, so ist es einfacher, das Protokoll zu sehen. Bevor Sie dieses Programm ausgeführt wird, bestätigen Sie bitte die Lese- / Schreibberechtigung für die Ausgabe Flatfile (filelist.txt).

Es hilft wissen, was alle Dateien / Update auf diesen bestimmten Datum der gewünschten Daten erstellt werden. Die meisten Malware-Programme versuchen, die Dateien zu injizieren / beeinflussen, so dass er die betroffenen Dateien zu debuggen hilft. Ich schrieb dieses Skript mit Borland C ++ 5.5-Version unter Windows-Plattform.

Sie finden den Quellcode von meinem Tech-Blog - 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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top