Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2

Скопировать директорию

17.06.2013, 21:21. Показов 2296. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите дописать. Моя программа должна в определенное время (допустим, каждый день в 21:00) делать копию определенной директории. Функцию по копированию директорий я нашел, но она не работает; вот что компилятор пишет:
Bash
1
c:/mingw64/x86_64-w64-mingw32/include/boost/filesystem/operations.hpp:384: undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
Плюс, надо еще задать время пробуждения потока. Тут или что то из chrono подобрать надо или из Boost.Date_Time. Вот сам код:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <chrono>
#include <thread>
#include <windows.h>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
 
namespace fs = boost::filesystem;
 
bool copyDir(boost::filesystem::path const & source, boost::filesystem::path const & destination)
{
    try
    {
        // Check whether the function call is valid
        if(!fs::exists(source) || !fs::is_directory(source))
        {
            std::cerr << "Source directory " << source.string()
                << " does not exist or is not a directory." << std::endl;
            return false;
        }
        if(fs::exists(destination))
        {
            std::cerr << "Destination directory " << destination.string()
                << " already exists." << std::endl;
            return false;
        }
        // Create the destination directory
        if(!fs::create_directory(destination))
        {
            std::cerr << "Unable to create destination directory"
                << destination.string() << std::endl;
            return false;
        }
    }
    catch(fs::filesystem_error const & e)
    {
        std::cerr << e.what() << std::endl;
        return false;
    }
    // Iterate through the source directory
    for(fs::directory_iterator file(source); file != fs::directory_iterator(); ++file)
    {
        try
        {
            fs::path current(file->path());
            if(fs::is_directory(current))
            {
                // Found directory: Recursion
                if(!copyDir(current, destination / current.filename()))
                {
                    return false;
                }
            }
            else
            {
                // Found file: Copy
                fs::copy_file(current, destination / current.filename());
            }
        }
        catch(fs::filesystem_error const & e)
        {
            std:: cerr << e.what() << std::endl;
        }
    }
    return true;
}
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
    
    //copyDir(fs::path("E:\\Test"), fs::path("E:\\Temp"));
    
    do
    {
        copyDir(fs::path("E:\\Test"), fs::path("E:\\Temp"));
        
        //как задать определенное время часов???
        std::this_thread::sleep_until("21:00");  //спать 24 часа до 21:00
    } while (true);
    
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2013, 21:21
Ответы с готовыми решениями:

Указать директорию
Здравствуйте. Пишу программу в борланде 6, в которой надо указать путь, из которого программа будет брать фаилы. С помощью чего это можно...

Как в консольном приложении узнать текущую директорию?
Пишу в Visual C++ 2008.

Как скопировать выделенный файл в listbox и переместить/скопировать в нужную директорию?
Как скопировать выделенный файл в listbox и переместить/скопировать в нужную директорию? вот код выделенного файла в папке : string str...

4
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.06.2013, 21:53
C++
1
#include <boost/filesystem.hpp>
???
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
17.06.2013, 22:31  [ТС]
Тоже самое. Ошибка в блоке
C++
1
2
3
4
5
else
{
      // Found file: Copy
      fs::copy_file(current, destination / current.filename());
}
Добавлено через 30 минут
Оказывается не работало из за -std=c++11. Надо макрос добавить
C++
1
#define BOOST_NO_CXX11_SCOPED_ENUMS
В чем прикол не знаю, вот тут вычитал: link.
Остался только второй вопрос - как правильно задать время простоя. Да, и вот еще заметил, если папка назначения уже существует, то ничего не копируется, fs::copy_option::overwrite_if_exists не помогает.
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.06.2013, 10:45
DiffEreD, Время простоя можно задать через chrono/datetime собственно...
C++
1
2
3
4
const boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time();
const boost::posix_time::ptime next = now + dt::days(1);
const boost::posix_time::ptime until = boost::posix_time::ptime(next.date(), boost::posix_time::time_duration(21, 0, 0));
std::this_thread::sleep_for(std::chrono::seconds((until - now).total_seconds()));
1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.06.2013, 00:08  [ТС]
Дописал (решил проблему с копированием), вот:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <chrono>
#include <thread>
#include <cstdlib>
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <windows.h>
 
namespace fs = boost::filesystem;
namespace dt = boost::gregorian;
namespace pt = boost::posix_time;
namespace chr = std::chrono;
 
bool copyDir(const fs::path& source, const fs::path& destination)
{
    try
    {
        if (!fs::exists(source) || !fs::is_directory(source))
        {
            std::cerr<<source<<" не существует или это не директория."<<std::endl;
            return false;
        }
        if (!fs::exists(destination))
        {
            if (!fs::create_directory(destination))
            {
                std::cerr<<"Невозможно создать директорию для копирования."<<std::endl;
                return false;
            }
        }
    }
    catch(fs::filesystem_error const & e)
    {
        std::cerr<<e.what()<<std::endl;
        return false;
    }
 
    for(fs::directory_iterator file(source); file != fs::directory_iterator(); ++file)
    {
        try
        {
            fs::path current(file->path());
            if(fs::is_directory(current))
            {
                if(!copyDir(current, destination / current.filename()))
                    return false;
            }
            else
                fs::copy_file(current, destination / current.filename(), fs::copy_option::overwrite_if_exists);
        }
        catch(fs::filesystem_error const & e)
        {
            std::cerr<<e.what()<<std::endl;
        }
    }
    return true;
}
 
int main(int argc, char** argv) //path(from) path(to) time
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
    
    if (argc < 4) 
    {
        std::cerr<<"Недостаточно аргументов командной строки.\n";
        exit(EXIT_FAILURE);
    }
    else
    {
        pt::ptime now, until;
        do
        {
            if (copyDir(fs::path(argv[1]), fs::path(argv[2])))
                std::cout<<"Папка успешно скопирована."<<std::endl;
            else
                exit(EXIT_FAILURE);
        
            now = pt::second_clock::local_time();
            until = pt::ptime(now.date(), pt::time_duration(pt::duration_from_string(argv[3])));
        
            if (until < now) until += dt::days(1);
        
            std::this_thread::sleep_for(chr::seconds((until - now).total_seconds()) + chr::seconds(2));
        } while (true);
    }
    
    return 0;
}
Запускаю батником с командой: C:\copy_dir.exe I:\C++\Code D:\Books\Code 21:00. Удобная штука получилась.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.06.2013, 00:08
Помогаю со студенческими работами здесь

Скопировать файл в директорию
Доброго времяни суток господа, помогите. &lt;?php $bir = $_GET; if (mkdir($bir,0777)) { echo &quot;ok1&quot;; } $dir = opendir($bir); {...

Скопировать директорию в C++ Builder
Вечер добрый, народ. Кто знает, как можно скопировать непустую директорию?

Как скопировать файл в системную директорию
Ребята подскажите пожалуйста, как скопировать файл в системную директорию независимо от буквы диска?

Скопировать конкретную директорию в указанное место
Что-то в совсем запутался. Мне нужно скопировать папку из одного места в другое целиком (не золизая в первую папку). Я делаю так: ...

Скопировать выбранный файл в другую директорию
Всем привет, помогите новичку с кодом, занимаюсь по книжке, вообщем задание было сделать программу графическую которая бы копировала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru