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

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

06.11.2010, 19:26. Показов 15658. Ответов 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
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
9911 / 6448 / 2455
Регистрация: 21.01.2014
Сообщений: 27,373
Записей в блоге: 3
21.07.2016, 11:43
Within_t, попробуй флаг добавить FOF_NOCONFIRMATION
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru