Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096

Копирование их под каталогов.

27.12.2010, 07:22. Показов 4406. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро! У меня есть не большая программа по нахождению на диске С текстовые файлы.
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString DialogTitle;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
int MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true )
{
SHFILEOPSTRUCT sh;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_FILESONLY;
sh.wFunc = toCopy ? FO_COPY : FO_MOVE;
sh.pFrom = slSourceDir.c_str();
sh.pTo = slTargetDir.c_str();
sh.hNameMappings = NULL;
sh.lpszProgressTitle = NULL;
return SHFileOperation ( &sh );
}
//Ñ èñïîëüçîâàíèåì îòäåëüíîé ñàìîïèñíîé ôóíêöèè
           
void DeleteFiles(String Dir, String Mask)
             {
           TSearchRec f;  //Î ðàáîòå ñ TSearchRec ìîæåòå ãäå-íèáóäü ïðî÷èòàòü ñàìè
 
          TStringList*s=new TStringList;  //Â ýòîì ñïèñêå áóäåò ñîäåðæàòñÿ ñïèñîê âñåõ ôàéëîâ çàäàííîãî ðàñøèðåíèÿ
 
AnsiString Path = Dir+"*."+Mask;
 
TSearchRec sr;
 
int done = FindFirst( Path, faAnyFile, sr );
while(!done)
{
 
s->Add(sr.Name);
 
done = FindNext(sr);
}
FindClose(sr);
 
 for(int i=0;i<s->Count;i++)  //Ïðîõîäèìñÿ öèêëîì ïî âñåìó ñïèñêó è óäàëÿåì ôàéëû
 {
if(!MoveFiles(Dir+s->Strings[i], "E:\\rew\\" +s->Strings[i]))
ShowMessage("Ok");
else ShowMessage("No");
   DeleteFile(Dir+s->Strings[i]);  //Ñàìî óäàëåíèå
 }
 
delete s;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DeleteFiles("C:\\","txt");
}
//---------------------------------------------------------------------------
Но дело в том что она ищет только в папке но не в подкаталогах. Помогите мне разобраться. Мне надо что-бы она искала на диске С все текстовые файлы. Буду очень благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2010, 07:22
Ответы с готовыми решениями:

Копирование каталогов
Доброго времени суток. Как можно реализовать копирование каталогов (пустого/с файлами/с подпапками)? Перемещение по каталогам осуществляю...

Копирование каталогов в Builder c++ (Проблема!)
Друзья, надеюсь на вашу помощь! Мне необходимо сделать программно вещь, которая будет считывать файлы(допустим с флэшки) и копировать их в...

Копирование всех каталогов с одним заданным именем из множества неизвестных каталогов
Всем добрый день. Сложилась необходимость создания бекапа определенной папки в пользовательских папках на терминальном сервере. Итак,...

10
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
27.12.2010, 09:21
Вот, рекурсивный поиск в каталогах и подкаталогах:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TStringList* FindAllFile(AnsiString path, AnsiString ext)
{
TStringList* result = new TStringList;
TSearchRec rc;
if (!FindFirst(path+ext,faAnyFile,rc))
{
do
{
if (rc.Name!="." && rc.Name!="..")
{
if ((rc.Attr&faDirectory) || rc.Attr==faDirectory){result->Text=result->Text+FindAllFile(path+rc.Name+"\\",ext)->Text;}
else {result->Add(path+rc.Name);}
}
}
while(FindNext(rc)==0);
}
return result;
}
Добавлено через 2 минуты
P.S: Работает так:

C++
1
2
ShowMessage(FindAllFile("C:\\", "*.*")->Text); //покажет все файлы в папке и её подкаталогах.
/* после указания папки либо диска не забывать \\ */
1
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096
27.12.2010, 12:22  [ТС]
Matrica, Простите но Ваш код не ищет из под каталогов. Я создал новую папку на диске С и создал там текстовый файл и он не был найден Вашим кодом.

Добавлено через 29 минут
Вот все разобрался спасибо.
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void ListFiles(AnsiString path, TStrings* List)
{
TSearchRec sr;
if (FindFirst(path+"*.*",  faAnyFile, sr) == 0)
{
     do
     {
         if (sr.Attr &  faDirectory)
          {
              if (sr.Name!=".")
              if  (sr.Name!="..")
              {
                  ListFiles(path+sr.Name+"\\",List);
              }
          }
          else
          {
           AnsiString  Ext=ExtractFileExt(sr.Name).UpperCase();
           if  (Ext==".ASM")
           {
           List->Add(path+sr.Name);
           DeleteFile(path+sr.Name);
           }
          }
     }
     while  (FindNext(sr) ==  0);
     FindClose(sr);
}
    Application->ProcessMessages();
 
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListFiles("c:\\ASM\\",Memo1->Lines);
}
//---------------------------------------------------------------------------
Добавлено через 51 минуту
Только код осторожно пробуйте, он удаляет .ASM.
0
Now I Matrix
137 / 134 / 28
Регистрация: 01.03.2010
Сообщений: 223
27.12.2010, 15:12
C++
1
2
3
4
5
6
7
          AnsiString  Ext=ExtractFileExt(sr.Name).UpperCase();
           if  (Ext==".ASM")
           {
           List->Add(path+sr.Name);
           DeleteFile(path+sr.Name);
           }
          }
- Зачем делать так если можно сделать так:
C++
1
2
3
4
5
 
if (FindFirst(path+"*.*",  faAnyFile, sr) == 0)//это
/*поменять*/
if (FindFirst(path+"*.asm",  faAnyFile, sr) == 0)//на это
//и тогда ваш код сократиться, подумайте сами как! ;)
Если не прав, извините.
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
27.12.2010, 15:16
doocee, совсем недавно писал аналогичную функцию: Перечислить файлы в директории по маске (Из С# в С++)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.12.2010, 17:01
doocee, главное состоит в том, что работу в подкаталогах тебе надо организовывать ручками. FindFirstработает только в рамках одного каталога, не заходя в подкаталоги. Далее в найденном ты выбираешь подкаталоги и рекурсивно запускаешь в них свою функцию. В примере от MikeSoft это место соответсвует комментарию "если хотите сюда можете дописать рекурсивный вызов"
0
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096
28.12.2010, 00:32  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
doocee, главное состоит в том, что работу в подкаталогах тебе надо организовывать ручками. FindFirstработает только в рамках одного каталога, не заходя в подкаталоги. Далее в найденном ты выбираешь подкаталоги и рекурсивно запускаешь в них свою функцию. В примере от MikeSoft это место соответсвует комментарию "если хотите сюда можете дописать рекурсивный вызов"
Так что разве мой код не работает? Вроде все как хотелось бы.
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
28.12.2010, 00:38
Цитата Сообщение от Evg Посмотреть сообщение
В примере от MikeSoft это место соответсвует комментарию "если хотите сюда можете дописать рекурсивный вызов"
Верно, в прошлом задании рекурсии не требовали - поэтому я её не дописал...
Для полноты, приведу чуть переделанную функцию, в которой добавлен рекурсивный обход:
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
void ListFiles(String Path, String FilterExt, TStrings* List, bool NeedFullNames, bool Recursive)
{
  TSearchRec SearchRec;
  FilterExt = FilterExt.UpperCase();
  if (FindFirst(Path+"*.*", faAnyFile, SearchRec) == 0) {
    do {
      if (SearchRec.Attr & faDirectory) {
        if (Recursive) {
          if (SearchRec.Name != ".") {
            if (SearchRec.Name != "..") {
              ListFiles(Path + SearchRec.Name + "\\", FilterExt, List, NeedFullNames, Recursive);
              // Рекурсивный обход всех подпапок
            }
          }
        }
      } else {
        String Ext = ExtractFileExt(SearchRec.Name).UpperCase();
        if  (Ext == FilterExt) {
          if (NeedFullNames) {
            List->Add(Path+SearchRec.Name);
          } else {
            List->Add(SearchRec.Name);
          }
        }
      }
    } while  (FindNext(SearchRec) ==  0);
    FindClose(SearchRec);
  }
  Application->ProcessMessages();
}
2
 Аватар для Vlad_IT
1452 / 360 / 61
Регистрация: 03.04.2010
Сообщений: 2,096
28.12.2010, 02:05  [ТС]
Спасибо конечно. Но разве мой код на 3 посту не хороший? Вроде все ищет, может как копировать так и удалят.
0
 Аватар для AlexSt
61 / 60 / 9
Регистрация: 13.01.2009
Сообщений: 322
28.12.2010, 08:22
Дубль 3, вот ссылка на тему , там готовые функции для поиска файлов, на дисках(типы дисков тоже можно выбрать, или выбрать все) и в подкаталогах, по маске. https://www.cyberforum.ru/cpp-... 17890.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.12.2010, 09:32
Цитата Сообщение от doocee Посмотреть сообщение
Спасибо конечно. Но разве мой код на 3 посту не хороший? Вроде все ищет, может как копировать так и удалят.
Что-то я проглядел. В код не вникал, но с виду нужно делать что-то, похожее на то.

Кстати, уже много раз видел подобным образом написанный код и уже не смог удержатться. Подобные интерфейсы разрабатываются для того, чтобы использовать в цикле for, а все почему-то используют if и цикл do-while. Я так обычно делаю:

C++
1
2
3
4
5
6
7
for (int r = FindFirst (...);
     r == 0;
     r = FindNext (...))
{
  ...
}
FindClose (...);
Единственное, что я бы исправил в твоём подходе - это параметр path. Я бы отдельно подавал path как путь до каталога и отдельно шаблон поиска файлов (куда подавал бы "*.asm"). Именно об этом тебе сказали в посте #4, но невнятно. Но при таком подходе надо подкаталоги искать отдельно (т.к. там нуден шаблон *.*), а файл отдельно. Это немного увеличит размер кода, но работать будет быстрее, потому как при поиске файлов через *.* у тебя будет очень много холостой работы с ненужными файлами

Цитата Сообщение от AlexSt Посмотреть сообщение
Дубль 3, вот ссылка на тему , там готовые функции ...
Если я правильно понял ТС'а, то он вовсе не ищет готовое решение, а хочет понять, почему его решение неправильно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2010, 09:32
Помогаю со студенческими работами здесь

Курсач горит,нужно организовать удаление каталогов и копирование каталогов
Народ кто нито помогите с курсачем нужно что бы каталоги удалял с запросом и каталоги перемещал,а то не получается(( очень надо

Копирование каталогов
Всем привет. Стоит задача, скопировать из источника A на источник B каталог. Но скопировать требуется самый новый каталог по пути. ...

Копирование файлов и каталогов
у МЕНЯ ТАКОЙ ВОПРОС а Можно ли Копирование файлы и каталоги написанной прогой на Ассемблере! Какими функциями выполняется копирование? ...

Копирование каталогов и файлов
Народ такая проблема: Надо сравнить каталогов и файлов между дисками d:\ и I:\ и копировать из d\ в I:\ только те которые ...

Копирование файлов без каталогов
Добрый день! Помогите с такой задачей: не могу придумать батник который копирует определённые файлы с подкаталогов своего корневого...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru