Форум программистов, компьютерный форум CyberForum.ru

Наполнение директории по условию - C++

Восстановить пароль Регистрация
 
Morfeus
9 / 9 / 1
Регистрация: 22.10.2010
Сообщений: 110
17.11.2012, 21:21     Наполнение директории по условию #1
Дано два каталога, содержащих файлы *.txt и не содержащие подкаталогов. Третий заполняем сами следующим образом: нужно сравнить два каталога разницу записать в третий. Проверка проводится только для файлов *.txt.

В третий каталог нужно положить все файлы, которые есть в первом каталоге , но отсутствуют во втором.
В третий каталог нужно положить все файлы, которые есть во втором каталоге , но отсутствуют в первом.

Добавлено через 1 час 48 минут
короче что то намудрил, что даже сам запутался...)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
    WIN32_FIND_DATA f1; HANDLE hf1=FindFirstFile("C:\\WORK\\OS\\TEST\\dir1\\*.txt", &f1);
    WIN32_FIND_DATA f2; HANDLE hf2=FindFirstFile("C:\\WORK\\OS\\TEST\\dir2\\*.txt", &f2);   
    if (hf1!=INVALID_HANDLE_VALUE && hf2!=INVALID_HANDLE_VALUE) {
        do { 
            string  Path1="C:\\WORK\\OS\\TEST\\dir1\\", Path2="C:\\WORK\\OS\\TEST\\RESULT\\";
            Path1+=f1.cFileName;                Path2+=f1.cFileName;    
            string  Path3="C:\\WORK\\OS\\TEST\\dir2\\", Path4="C:\\WORK\\OS\\TEST\\RESULT\\";
            Path3+=f2.cFileName;                Path4+=f2.cFileName;
            CopyFile(Path1.c_str(),Path2.c_str(),true); CopyFile(Path3.c_str(),Path4.c_str(),true);
        }while ((FindNextFile(hf1,&f1)!=FindNextFile(hf2,&f2)) && (FindNextFile(hf2,&f2)!=FindNextFile(hf1,&f1)));      
    }
    FindClose(hf1);FindClose(hf2);
}

Помогите исправить по условию задания...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2012, 21:21     Наполнение директории по условию
Посмотрите здесь:

Чтение директории C++
C++ Файлы в директории.
Директории C++
Поиск файлов в директории C++
Листинг директории C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
18.11.2012, 00:45     Наполнение директории по условию #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <set>
#include <stdexcept>
#include <memory>
#include <algorithm>
#include <string>
#include <iterator>
#include <boost/regex.hpp>
#include <boost/filesystem.hpp>
#include <windows.h>
namespace fs = boost::filesystem3;
 
void GetFileNames(std::string const& dirpath, std::set<std::string>& set)
{
    static const boost::regex reg(".+\\.txt");
    static boost::system::error_code ec;
    static std::string s;
    fs::directory_iterator ib(dirpath, ec), ie;
    if(ec)
        throw std::runtime_error(ec.message());
    for(; ib != ie; ++ib)
    {
        s = ib->path().filename().string();
        if(boost::regex_match(s, reg))
        {
            set.insert(std::move(s));
        }
    }
}
 
int main()
{
    SetConsoleOutputCP(1251);
    std::set<std::string> set1, set2, set3;
    boost::system::error_code ec;
    std::string path1("c:/Test/Test1"), path2("c:/Test/Test2"), path3("c:/Test/Test3");
    GetFileNames(path1, set1);
    GetFileNames(path2, set2);
    std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(set3, set3.begin()));
    for(auto const& fname : set3)
    {
        fs::copy(path1 + '/' + fname, path3 + '/' + fname, ec);
        if(ec)
            std::cerr << "fs::copy failed on file: " << fname << std::endl;
    }
    return 0;
}
Morfeus
9 / 9 / 1
Регистрация: 22.10.2010
Сообщений: 110
18.11.2012, 19:20  [ТС]     Наполнение директории по условию #3
не работает
ругается на это
C++
1
2
#include <boost/regex.hpp>
#include <boost/filesystem.hpp>
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
18.11.2012, 20:52     Наполнение директории по условию #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <set>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <windows.h>
 
void GetFileNames(std::string const& dirpath, std::set<std::string>& set)
{
    static WIN32_FIND_DATAA fd;
    HANDLE hFile = FindFirstFileA((dirpath + "/*.txt").c_str(), &fd);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            set.insert(fd.cFileName);
        }
        while(FindNextFileA(hFile, &fd));
        FindClose(hFile);
    }
    else
        throw std::runtime_error("FindFirstFileA failed");
}
 
int main()
{
    try
    {
        char const* path1 = "c:/Test/Test1", *path2 = "c:/Test/Test2", *path3 = "c:/Test/Test3";
        std::set<std::string> set1, set2, set3;
        GetFileNames(path1, set1);
        GetFileNames(path2, set2);
        std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(set3, set3.begin()));
        for(auto const& fname : set3)
        {
            std::cout << fname << std::endl;
            if(!CopyFileA((std::string(path1) + '/' + fname).c_str(), (std::string(path3) + '/' + fname).c_str(), true))
            {
                std::cerr << "CopyFile failed on file: " << fname << std::endl;
            }
        }
    }
    catch(std::exception const& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}
Yandex
Объявления
18.11.2012, 20:52     Наполнение директории по условию
Ответ Создать тему
Опции темы

Текущее время: 17:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru