Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1447 / 355 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
1

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

27.12.2010, 07:22. Просмотров 2813. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2010, 07:22
Ответы с готовыми решениями:

Копирование каталогов
Доброго времени суток. Как можно реализовать копирование каталогов (пустого/с файлами/с...

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

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

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

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

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
1447 / 355 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
27.12.2010, 12:22  [ТС] 3
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
136 / 133 / 28
Регистрация: 01.03.2010
Сообщений: 223
27.12.2010, 15:12 4
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
Эксперт С++
3940 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
27.12.2010, 15:16 5
doocee, совсем недавно писал аналогичную функцию: Перечислить файлы в директории по маске (Из С# в С++)
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
27.12.2010, 17:01 6
doocee, главное состоит в том, что работу в подкаталогах тебе надо организовывать ручками. FindFirstработает только в рамках одного каталога, не заходя в подкаталоги. Далее в найденном ты выбираешь подкаталоги и рекурсивно запускаешь в них свою функцию. В примере от MikeSoft это место соответсвует комментарию "если хотите сюда можете дописать рекурсивный вызов"
0
1447 / 355 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
28.12.2010, 00:32  [ТС] 7
Цитата Сообщение от Evg Посмотреть сообщение
doocee, главное состоит в том, что работу в подкаталогах тебе надо организовывать ручками. FindFirstработает только в рамках одного каталога, не заходя в подкаталоги. Далее в найденном ты выбираешь подкаталоги и рекурсивно запускаешь в них свою функцию. В примере от MikeSoft это место соответсвует комментарию "если хотите сюда можете дописать рекурсивный вызов"
Так что разве мой код не работает? Вроде все как хотелось бы.
0
Эксперт С++
3940 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
28.12.2010, 00:38 8
Цитата Сообщение от 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
1447 / 355 / 61
Регистрация: 03.04.2010
Сообщений: 2,098
28.12.2010, 02:05  [ТС] 9
Спасибо конечно. Но разве мой код на 3 посту не хороший? Вроде все ищет, может как копировать так и удалят.
0
60 / 60 / 9
Регистрация: 13.01.2009
Сообщений: 322
28.12.2010, 08:22 10
Дубль 3, вот ссылка на тему , там готовые функции для поиска файлов, на дисках(типы дисков тоже можно выбрать, или выбрать все) и в подкаталогах, по маске. https://www.cyberforum.ru/cpp-... 17890.html
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
28.12.2010, 09:32 11
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2010, 09:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.