Вопрос

Я только начал изучать c ++ и в настоящее время использую codeblocks.я хочу написать приложение, которое может выполнять поиск файлов в каталоге, включая его вложенные папки, но, похоже, я не могу найти хороших примеров для этого, и я где-то читал, что это возможно только через библиотеку, подобную boost.

  1. это правда?
  2. есть какие-нибудь примеры того, как сделать это без библиотеки?

заранее благодарю

Это было полезно?

Решение

Также его можно использовать с помощью системных вызовов операционной системы, например, readdir в Linux.boost (и другие библиотеки) позволят вам писать переносимый код для нескольких (всех?) Операционных систем.

Здесь вы можете найти подробные примеры http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046380353&id=1044780608

Другие советы

Да, это правда:стандартный C ++ не имеет API-интерфейсов для перечисления содержимого каталога.

Таким образом, вы либо делаете это через библиотеку (Boost или другие), либо через собственные вызовы для используемой вами операционной системы (FindFirstFile / FindNextFile в Windows, opendir / readdir в Unix).В других ответах есть пример кода.

Но если вы только начали изучать C ++, вероятно, лучше пока не бороться с этим.Для начала сосредоточьтесь на изучении стандартного языка C ++.Написание приложения, которое вы имели в виду, - полезное упражнение, но я бы немного отложил его до тех пор, пока вы не будете лучше знакомы со стандартным C ++.

Boost - это не единственный способ сканирования каталогов, но, вероятно, это самый простой способ сделать это нейтральным для платформы способом, т. Е.без использования API, зависящего от конкретной платформы (например, Win32).

Вот простой пример использования 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;
}

Этот скрипт используется для сбора информации о дате создания файлов и модификации с вашего системного диска, мы можем выполнить поиск по любой дате, чтобы узнать результаты, и все выходные данные будут сохранены в виде плоского файла, так что просматривать журнал будет проще.Перед запуском этой программы, пожалуйста, подтвердите разрешение на чтение / запись для выходного плоского файла (FileList.txt).

Это помогает узнать, какие все файлы созданы / обновлены на указанную дату поиска.Большинство вредоносных программ пытаются внедрить / повлиять на файлы, поэтому это помогает отладить эти затронутые файлы.Я написал этот скрипт, используя Borland C ++ версии 5.5 под платформу Windows.

Пожалуйста, найдите исходный код в моем техническом блоге - 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top