Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/83: Рейтинг темы: голосов - 83, средняя оценка - 4.53
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Как программно скопировать папку

06.11.2010, 19:26. Показов 15651. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

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

Заранее благодарен.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2010, 19:26
Ответы с готовыми решениями:

Как программно скопировать файл???
OpenDialog1->Execute(); DBEdit10->Text=OpenDialog1->FileName; Как реализовать, чтоб выбраный файл, скопировало в нужную мне...

Как скопировать выбранное пользователем изображение через OpenDialog в другую папку
как скопировать выбранное пользователем изображение через OpenDialog в другую папку Помогите пожалуйста, чо-то не получается(((( пишу...

Скопировать файл в созданную папку
Добрый день! Проблемма с копированием файла в созданный каталог (программно) Пример: //создаем папку TDateTime T(Now()); ...

25
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
06.11.2010, 23:52
Sasha, не знаю, есть ли такая API-функция, я ее не встречал.
Но можно с помощью функций findfirst-findnext отсканировать папку и рекурсивно все ее подпапочки.
У меня есть чего-то такое в старых архивах, но состояние и стиль таковы, что мне стыдно их выкладывать.
ДА, еще не забудьте mkdir для создания новой папки.
Если не разберешься - сигналь. Мне давно пора привести эту часть своего архива в порядок.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
07.11.2010, 00:30  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Я нашёл ответ

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::Button1Click(TObject *Sender)
{
cp("C:\\install\\12","D:\\");        
}
//---------------------------------------------------------------------------
 
 void __fastcall TForm1::cp(String FileSource, String FileDestan)
      {
      char cFrom[MAX_PATH]={0};
      strcpy(cFrom,FileSource.c_str());
 
      SHFILEOPSTRUCT fos;
      memset(&fos,0,sizeof(SHFILEOPSTRUCT));
      fos.hwnd = Application->Handle;
      fos.wFunc = FO_COPY;
      fos.pFrom = cFrom;
      fos.pTo = FileDestan.c_str();
      fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;
      SHFileOperation(&fos);
      ShowMessage("Копирование закончилось");
      }
6
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
07.10.2011, 02:26
Как быть если папка откуда и папка куда находятся в одной папке с ехе но общая папка может быть в разных местах?
Базу данных пишу.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.10.2011, 03:34
Цитата Сообщение от Samrisbe Посмотреть сообщение
но общая папка может быть в разных местах?
одновременно ?
и для чего придумали "общие" папки типа
c:\Users\Public\Documents\
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
07.10.2011, 10:59
Цитата Сообщение от LK Посмотреть сообщение
одновременно ?
и для чего придумали "общие" папки типа
Я имел папка с базой может быть в любом месте на пк.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
07.10.2011, 11:31  [ТС]
Цитата Сообщение от Samrisbe Посмотреть сообщение
Я имел папка с базой может быть в любом месте на пк.
Ну так прописывай путь к этой папке и всё
1
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 13
17.12.2012, 13:55
Подскажите, пожалуйста, в чём может быть проблема...
При копировании папки (Например: new_folder)из test1 в test2...Копирование происходит как надо(появляется папка test2\new_folder)...а при запуске этой программы второй раз и далее она копируется в папку (test2\new_folder\new_folder)...из-за чего так происходит? я хочу чтоб она у меня всегда в test2\
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
string from = "С:\\test1\\";
    string to = "C:\\test2\\";
            char chFrom [256], chTo [256];
            str_from=from+strSpec;
            str_to=to+strSpec;
            strcpy (chFrom, str_from.c_str());
            strcpy (chTo, str_to.c_str());
 
            chFrom[strlen(chFrom)] = 0;            //Добавляем два нуля к концу строки
            chFrom[strlen(chFrom) + 1] = 0;
 
            chTo[strlen(chTo)] = 0;                     //Добавляем два нуля к концу строки
            chTo[strlen(chTo) + 1] = 0;
 
            SHFILEOPSTRUCTA lpFileOp;
            lpFileOp.hwnd = 0;
            lpFileOp.wFunc = FO_COPY;
            lpFileOp.pFrom = chFrom;
            lpFileOp.pTo = chTo;
            lpFileOp.fFlags =FOF_NOERRORUI|FOF_NOCONFIRMATION|FOF_SILENT;
            lpFileOp.fAnyOperationsAborted = 0;
            lpFileOp.hNameMappings = 0;
            lpFileOp.lpszProgressTitle = 0;
            SHFileOperation (&lpFileOp);
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2012, 14:51
Выкладывай полный код, так ничего не понять. Что такое strSpec, как заполняется?
1
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 13
17.12.2012, 15:13
ааа...сам уже разобрался как раз этот strSpec, не надо прибавлять тут:str_to=to+strSpec;
Теперь всё работает как надо. Спасибо.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
05.12.2013, 23:30
Я переписал код Sasha, но он что-то не копирует папку с ее содержимым Хотя выводит Копирование закончилось

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 void cp(String FileSource, String FileDestan)
      {
      char cFrom[MAX_PATH]={0};
      strcpy(AnsiString(cFrom).c_str(),AnsiString(FileSource).c_str());
 
      SHFILEOPSTRUCT fos;
      memset(&fos,0,sizeof(SHFILEOPSTRUCT));
      fos.hwnd = Application->Handle;
      fos.wFunc = FO_COPY;
      AnsiString(fos.pFrom)= cFrom;
      fos.pTo = FileDestan.c_str();
      fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;
      SHFileOperation(&fos);
      ShowMessage("Копирование закончилось");
      }
Писал для XE2. Скажите в чем косяк...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
06.12.2013, 01:04
Цитата Сообщение от Gdasar Посмотреть сообщение
C++
1
fos.pTo = FileDestan.c_str();
Здесь точно строка с двойным нулем в конце (double null-terminated), без Wildcard-ов и определяющая абсолютный путь?
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
06.12.2013, 10:59
C++
1
cp("C:\\Users\\Jarvis\\Desktop\\testing\\Win32\\Debug\\TT\\3\0\0","C:\\Users\\Jarvis\\Desktop\\testing\\Win32\\Debug\\DOM\0\0");
UI, может,я не так Вас понял.
P.S. копирование не происходит.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
06.12.2013, 11:58
Лучший ответ Сообщение было отмечено Persk как решение

Решение

Цитата Сообщение от Gdasar Посмотреть сообщение
копирование не происходит.
Ошибки проверять - это для неудачников, правда?


C++
1
2
3
4
5
6
7
      int result = SHFileOperation(&fos);
      if(result)
      {
          //
          ShowMessage(IntToStr(result));
      }
      else ShowMessage(_T("Копирование закончилось"));
Теперь что говорит? Тоже "Копирование закончилось?"

Я сделал гораздо проще:

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
#include <tchar.h>
 
// ...
 
void cp(String FileSource, String FileDestan)
{
    TCHAR cFrom[MAX_PATH] = {0};
    _tcscpy(cFrom, FileSource.c_str());
 
    TCHAR cTo[MAX_PATH] = {0};
    _tcscpy(cTo, FileDestan.c_str());
 
    SHFILEOPSTRUCT fos;
    memset(&fos, 0, sizeof(SHFILEOPSTRUCT));
    fos.hwnd = Application->Handle;
    fos.wFunc = FO_COPY;
    fos.pFrom = cFrom;
    fos.pTo = cTo;
    fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;
 
    int result = SHFileOperation(&fos);
    if (result)
    {
        ShowMessage(IntToStr(result));
    }
    else
        ShowMessage(_T("Копирование закончилось"));
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    cp(_T("D:\\test\\Games2013\\tennis"), _T("D:\\test\\Games2013\\play\\tennis22"));
}
, и все прекрасно копируется...
2
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
21.05.2016, 13:41
Отличный код, очень полезный, спасибо. Подскажите только, почему при
C++
1
cp(_T("F:\\*.*"), _T("D:\\Data"));
не получается скопировать - ошибка, нет прав на такую операцию... А очень нужно копировать полностью всю директорию, всё содержимое. А получается скопировать только конкретную папку...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
21.05.2016, 14:19
Famous_47, MSDN явно говорит ( SHFILEOPSTRUCT structure ) :
Standard MS-DOS wildcard characters, such as "*", are permitted only in the file-name position. Using a wildcard character elsewhere in the string will lead to unpredictable results.
, а ты пытаешься всунуть * именно в имя папки. Нельзя, функция на это не рассчитана.
0
 Аватар для Famous_47
1 / 1 / 1
Регистрация: 13.11.2015
Сообщений: 59
21.05.2016, 14:49
Убрав флаг FOF_FILESONLY получается копировать, но получаю сообщение об ошибке из-за отсутствия прав доступа к папке, хотя копирование выполняется. Сейчас попробую с другими флагами поиграться, спасибо за ссылку, я находил гораздо меньше флагов в другом описании

Добавлено через 14 минут
Проблема в том, что при попытке копирования получается попытка скопировать папку System Volume Information. Хотя так ее не видно никак. Может исключить ее по названию из копирования? Или может как-то можно проверить на права доступа файлы перед копированием?

Флаги FOF_NOCOPYSECURITYATTRIBS , FOF_NOERRORUI не дают результата

P.S. FOF_FILESONLY не причем, просто кроме папок в директории больше ничего не было, и казалось что копирование не происходит.
0
 Аватар для Within_t
34 / 21 / 11
Регистрация: 20.10.2013
Сообщений: 577
21.07.2016, 11:08
volvo, Как в 14 посте сделать так, чтобы не вылетало окон с подтверждением перезаписи файла???
0
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
21.07.2016, 11:43
Within_t, попробуй флаг добавить FOF_NOCONFIRMATION
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
21.07.2016, 11:44
Попробовать добавить FOF_NOCONFIRMATION в 19-ой строке, это аналогично ответу "Yes to All" на все диалоговые окна.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.07.2016, 11:44
Помогаю со студенческими работами здесь

Удалить программно папку на диске С под опытным пользователем
Здравствуйте ребята помогите разобраться по такому вопросу. Можно ли как-нить удалить программно папку на диске С под опытным...

Как программно со страницы сайта создать или скопировать папку на хостинге
Уважаемые форумчане! Столкнулся с проблемой, которую не знаю, как решить. Необходимо по нажатию кнопки на странице сайта создать папку...

Как скопировать папку с файлами в другую папку с заменой средствами php?
Как скопировать папку с файлами в другую папку с заменой средствами php? Из &quot;Z:/home/post.ru/www/style/&quot; в...

Как скопировать *.jpg из определенной папки и скопировать в папку Temp?
Подскажите как правильно переписать данный код чтобы он работал: begin WinExec('cmd.exe /c move'+Form2.Edit1.Text+'\*.jpg...

Как скопировать папку с файлами в нужную папку?
Есть флешка, есть некая папка на флешке допустим D:/1 как скопировать всю папку с файлами и вставить C:/Program Files (x86) Там надо чтоб...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru