поиск или перебор файлов на диске!
От: BOSSSS Россия  
Дата: 18.02.08 02:31
Оценка:
Доброго дня!

прошу помочь в следующем вопросе:
хочу написать програмку по поиску или перебору конкретных файлов.
Буду признателен за помощь и за код.
Спасибо!

18.02.08 15:35: Перенесено модератором из 'C/C++' — Кодт
Re: поиск или перебор файлов на диске!
От: BOSSSS Россия  
Дата: 18.02.08 03:17
Оценка:
Правильнее будет выразиться поиск по заданной маске.
А в найденных файлах делать изменения или удаления?

Спасибо.
Re: поиск или перебор файлов на диске!
От: AleksandrN Россия  
Дата: 18.02.08 08:16
Оценка: +1
Здравствуйте, BOSSSS, Вы писали:

BOS>хочу написать програмку по поиску или перебору конкретных файлов.


FindFirstFile, FindNextFile, FindClose (WinAPI)

или

findfirst, findnext, findclose
Re: поиск или перебор файлов на диске!
От: zaufi Земля  
Дата: 18.02.08 13:46
Оценка:
Здравствуйте, BOSSSS, Вы писали:

BOS>Доброго дня!


BOS>прошу помочь в следующем вопросе:

BOS>хочу написать програмку по поиску или перебору конкретных файлов.
BOS>Буду признателен за помощь и за код.
BOS>Спасибо!

ну раз ты не указываешь платформу в вопросе... %) see also:
closedir(3), fnmatch(3), opendir(3), readdir(3), scandir(3)
Re[2]: поиск или перебор файлов на диске!
От: zaufi Земля  
Дата: 18.02.08 13:47
Оценка: +1
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, BOSSSS, Вы писали:


BOS>>Доброго дня!


BOS>>прошу помочь в следующем вопросе:

BOS>>хочу написать програмку по поиску или перебору конкретных файлов.
BOS>>Буду признателен за помощь и за код.
BOS>>Спасибо!

Z>ну раз ты не указываешь платформу в вопросе... %) see also:

Z>closedir(3), fnmatch(3), opendir(3), readdir(3), scandir(3)

ну а более-менее кроссплатформено: boost::filesystem -- там есть итератор по файлам в каталоге...
Re[3]: поиск или перебор файлов на диске!
От: Sni4ok  
Дата: 18.02.08 17:07
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>ну а более-менее кроссплатформено: boost::filesystem -- там есть итератор по файлам в каталоге...


boost::filesystem не поддерживает маски
Re[4]: поиск или перебор файлов на диске!
От: zaufi Земля  
Дата: 18.02.08 17:10
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, zaufi, Вы писали:


Z>>ну а более-менее кроссплатформено: boost::filesystem -- там есть итератор по файлам в каталоге...


S>boost::filesystem не поддерживает маски


какой ужос!
Re[4]: поиск или перебор файлов на диске!
От: Socket Ниоткуда http://www.samborsky.com
Дата: 18.02.08 19:42
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, zaufi, Вы писали:


Z>>ну а более-менее кроссплатформено: boost::filesystem -- там есть итератор по файлам в каталоге...


S>boost::filesystem не поддерживает маски


зато в бусте есть regex_match и можно отбросить по нему все что не подошло
http://www.samborsky.com — мой блог
Re[5]: поиск или перебор файлов на диске!
От: zaufi Земля  
Дата: 18.02.08 20:53
Оценка:
Здравствуйте, Socket, Вы писали:

S>Здравствуйте, Sni4ok, Вы писали:


S>>Здравствуйте, zaufi, Вы писали:


Z>>>ну а более-менее кроссплатформено: boost::filesystem -- там есть итератор по файлам в каталоге...


S>>boost::filesystem не поддерживает маски


S>зато в бусте есть regex_match и можно отбросить по нему все что не подошло


еще большая ценность boost::filesystem пожалуй в том что его итераторы можно сувать в стандартные алгоритмы чтобы выбрать те файлы что те нада как из обычного контейнера... ну а написать функтор который матчит нужную тебе маску IMHO несколько проще чем пользоваться системно зависимыми функциями поиска указанными в других постах...
Re: поиск или перебор файлов на диске!
От: GSD  
Дата: 20.02.08 10:02
Оценка:
Здравствуйте, BOSSSS, Вы писали:

BOS>Доброго дня!


BOS>прошу помочь в следующем вопросе:

BOS>хочу написать програмку по поиску или перебору конкретных файлов.
BOS>Буду признателен за помощь и за код.
BOS>Спасибо!

Как-то давненько такой кодик написал:
// filelist.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stack>
#include <iostream>
#include <sstream>

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/exception.hpp>
#include <boost/filesystem/operations.hpp>

//#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>

namespace fs = boost::filesystem;
namespace cp = CryptoPP;
using namespace std;

// forward declaration
void directory_iterate(fs::path dir);
string calc_sha1(fs::path &file);
void usage();


int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"rus_rus");
    try
    {
        if(argc != 2)
            usage();
        else
        {
            char buf[2000];
            wcstombs(buf, argv[1], 1000);
            directory_iterate(fs::system_complete(fs::path(buf, fs::native)));
            //directory_iterate(fs::system_complete(fs::path(argv[1], fs::native)));
            //directory_iterate(fs::system_complete(fs::path((char*) argv[1], fs::native)));
            //directory_iterate(fs::system_complete(fs::path("c:\\temp\\Pictures", fs::native)));
        }
    }
    catch(fs::filesystem_error ex)
    {
        cout << ex.what() << endl;
    }
    return 0;
}

void usage()
{
    cout << "Usage: filelist dir" << endl;
}

void directory_iterate(fs::path dir)
{
    stack<fs::path> dir_list;
    if(fs::is_directory(dir)) dir_list.push(dir);

    fs::path cur_dir;
    fs::directory_iterator end_iter;
    while(!dir_list.empty())
    {
        cur_dir = dir_list.top();
        dir_list.pop();

        for(fs::directory_iterator cur_iter(cur_dir); cur_iter != end_iter; cur_iter++)
        {
            try
            {
                if(fs::is_directory(*cur_iter))
                    dir_list.push(*cur_iter);
                else
                {
                    string sha1 = calc_sha1(*cur_iter);
                    cout << cur_iter->root_path().native_directory_string() << "\t"
                        << cur_iter->branch_path().relative_path().native_directory_string() << "\t"
                        << cur_iter->leaf() << "\t"
                        << cur_iter->native_file_string() << "\t"
                        << fs::file_size(*cur_iter) << "\t"
                        << sha1 << endl;
                }
            }
            catch(fs::filesystem_error ex)
            {
                cout << ex.what() << endl;
            }
        }
    }
}

string calc_sha1(fs::path &file)
{
    byte sha1_hash[cp::SHA1::DIGESTSIZE];
    cp::SHA1 hash;

    const int BUF_SIZE = 32 * 1024;
    byte buf[BUF_SIZE];
    fs::basic_ifstream<byte> ifs(file, ios_base::in | ios_base::binary);
    int readed;

    do
    {
        ifs.read(buf, BUF_SIZE);
        readed = ifs.gcount();
        hash.Update(buf, readed);
    }
    while(readed == BUF_SIZE);
    hash.Final(sha1_hash);
    ifs.close();

    stringstream ss;
    hex(ss);
    for(int i = 0; i < cp::SHA1::DIGESTSIZE; i++)
    {
        ss.width(2); ss.fill('0');
        ss << (int) sha1_hash[i];
    }

    return ss.str();
}
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[6]: поиск или перебор файлов на диске!
От: Sni4ok  
Дата: 20.02.08 10:53
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>еще большая ценность boost::filesystem пожалуй в том что его итераторы можно сувать в стандартные алгоритмы чтобы выбрать те файлы что те нада как из обычного контейнера... ну а написать функтор который матчит нужную тебе маску IMHO несколько проще чем пользоваться системно зависимыми функциями поиска указанными в других постах...



boost::filesystem::exist и boost::filesyste::file_size под WIN32 кидают исключение если файл залочен, для сетевых шар
boost::filesystem::is_directory под WIN32 возвращает false, только не говорите, что это всё является достоинством файлсистема,
да это неплохая либа но как и любой другой либе ей свойственны косяки, и например организовать поиск по маске с помощью системных функций намного проще, чем с помощью буста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.