Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 17
1

Копирование групп файлов, имеющих особенности в именах (например *. Txt) или в содержании

06.10.2012, 12:35. Показов 2187. Ответов 11

Author24 — интернет-сервис помощи студентам
Есть файловый менеджер(простой), и это должно быть одной из его функций. Я, если честно, не совсем понимаю что от меня хотят. Помогите, пожалуйста, с кодом и, если не сложно, объясните что к чему

Может это просто копирование мультиселектом нужно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2012, 12:35
Ответы с готовыми решениями:

Копирование файлов из разных каталогов в каталоги с именами, соответствующими номерам в именах файлов
Добрый день! Помогите решить проблему. Есть семь папок (cam_1, cam_2, cam_3 и.т.д) с фотографиями...

Поиск в текстовых файлах символьных групп по шаблону и последующий поиск найденных в именах файлов (с логом)
Господа программисты! Прошу помочь в таком вопросе! Исходные данные: Последовательности...

Копирование файлов, не имеющих расширений
Всем привет, нужно чтобы скрипт скопировал 2 файла, у фалов нет расширения, но известны 4 первые...

Поиск слова (метки) в T.txt и копирование его и\или последующих слов (символов) в R.txt
День добрый. У меня проблемка в написании батника. Не получается командой FOR в текстовом файле...

11
898 / 345 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
06.10.2012, 13:40 2
Исходя из названия темы, то скопировать все файлы имеющие определенное имя или расширение в другую папку.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.10.2012, 19:20 3
Поиск файлов по маске и по содержимому можно организовать так:
Delphi
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
92
93
uses
  FileCtrl;
 
var
  //Путь к папке.
  gPath : String;
 
//Функция ищет в папке aPath все файлы, имена которых удовляетворяют маске aMask
//и в содержимом которых присутствует строка aTemp.
//Если aMask = '', то в качестве маски принимается шаблон: '*'
//Если aTemp = '', то поиск строки в файлах не производится.
function SearchFiles(const aPath, aMask, aTemp : String) : TStringList;
const
  SelfName = 'SearchFiles()';
var
  Fs : TFileStream;
  Sr : TSearchRec;
  Attr : Integer;
  Path, FileName, S, Mask : String; //AnsiString;
  IsFound : Boolean;
begin
  //Проверка пути.
  Path := aPath;
  if Path = '' then raise Exception.Create(SelfName + '. Не задан путь.');
  if not DirectoryExists(Path) then raise Exception.Create(SelfName + '. Путь не найден.');
  //Добавление завершающего слеша в пути.
  Path := IncludeTrailingPathDelimiter(Path);
  //Маска имён файлов.
  Mask := aMask;
  if Mask = '' then Mask := '*';
  //Значение атрибутов, соответствующее любым файлам, исключая папки и тома.
  Attr := faAnyFile - faDirectory - faVolumeID;
  //Создаём экземпляр результирующего списка.
  Result := TStringList.Create;
 
  try
    if FindFirst(Path + Mask, Attr, Sr) = 0 then
    repeat
      IsFound := True; //Флаг, показывающий - найдена ли строка в файле.
      //Если искомая строка не пустая, то выполняем поиск в файле.
      if aTemp <> '' then begin
        FileName := Path + Sr.Name;
        //Загрузка данных из файла и поиск строки.
        try
          //Открываем файл в режиме чтения.
          Fs := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
          SetLength(S, Fs.Size);
          Fs.Read(S[1], Fs.Size);
          FreeAndNil(Fs);
          //Поиск заданной подстроки и установка флага.
          IsFound := Pos(aTemp, S) > 0;
        except
          //Не удалось обработать файл: Sr.Name.
          IsFound := False;
        end;
      end;
      //Если строка в файле найдена, то добавляем имя файла в результирующий список.
      if IsFound then Result.Add(Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Mask, STemp : String;
  Sl : TStringList;
begin
  //Маска имён файлов.
  Mask := Edit1.Text;
  //Подстрока для поиска.
  STemp := Edit2.Text;
  //Путь к папке, в которой нужно произвести поиск. Начальное значение выбираем
  //равным пути к той папке, в которой расположена наша программа.
  if gPath = '' then gPath := ExtractFilePath(ParamStr(0));
  //Диалог выбора папки.
  if not SelectDirectory('Выбор папки', '', gPath) then Exit;
  //Создаём экземпляр списка.
  Sl := TStringList.Create;
 
  //Получаем список найденных файлов.
  Sl := SearchFiles(gPath, Mask, STemp);
 
  Memo1.Lines.Add('------------------------------');
  Memo1.Lines.Add('Путь: ' + gPath);
  Memo1.Lines.Add('Маска: "' + Mask + '"');
  Memo1.Lines.Add('Искомая строка: "' + STemp + '"');
  Memo1.Lines.Add('Перечень найденных файлов:');
  Memo1.Lines.AddStrings(Sl);
 
  FreeAndNil(Sl);
end;
Затем, можно добавить копирование. Для этого достаточно выполнить перебор списка Sl и скопировать каждый из файлов.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  NewPath : String;
  i : Integer;
...
begin
...
  //Полный путь к папке, в которой лежит исходный файл.
  gPath := IncludeTrailingPathDelimiter(gPath);
  //Полный путь к папке, в которую надо скопировать файл.
  NewPath := IncludeTrailingPathDelimiter(NewPath);
  //Копируем все найденные файлы.
  for i := 0 to Sl.Count - 1 do begin
    FileName1 := gPath + Sl[i];
    FileName2 := NewPath + Sl[i];
    if CopyFile(PChar(FileName1), PChar(FileName2), False) then
      Memo1.Lines.Add('Файл скопирован: ' + Sl[i])
    else
      Memo1.Lines.Add('Не удалось скопировать файл: ' + Sl[i]);
  end;
  
  FreeAndNil(Sl);
end;
1
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
09.04.2013, 21:02 4
Цитата Сообщение от Mawrat Посмотреть сообщение
Поиск файлов по маске и по содержимому можно организовать так:
Delphi 2010 применив этот код, у меня не находит файлов по содержимому. Если STemp:='' то в мемо выводятся файлы которые указаны в маске как и должно быть.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
09.04.2013, 21:28 5
Здесь надо использовать строки однобайтовых символов - AnsiString. Я в коде намекал об этом:
Цитата Сообщение от Mawrat Посмотреть сообщение
Delphi
1
Path, FileName, S, Mask : String; //AnsiString;
В Delphi 2009 и в более новых версиях надо сделать такие объявления:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function SearchFiles(const aPath, aMask : String; const aTemp : AnsiString) : TStringList;
const
  SelfName = 'SearchFiles()';
var
  Fs : TFileStream;
  Sr : TSearchRec;
  Attr : Integer;
  Path, FileName, Mask : String;
  S : AnsiString;
  IsFound : Boolean;
begin
...
end;
Кроме этого, вызов Pos() надо заменить на AnsiPos():
Delphi
1
2
          //Поиск заданной подстроки и установка флага.
          IsFound := AnsiPos(aTemp, S) > 0;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
09.04.2013, 21:43 6
Цитата Сообщение от tor2012 Посмотреть сообщение
Delphi 2010
вообще позволяет обойтись безо всех этих велосипедов. TDirectory.GetFiles, и будут тебе найдены и файлы по именам, и по содержимому, в одно выражение (строк, правда, получится чуть больше, чем одна, штук 7), и их имена будут помещены в дин. массив строк. А уж потом - вообще не проблема их куда-то в другое место перенести...
1
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
09.04.2013, 21:47 7
Спасибо большое! Если файлы в кодировке UTF-8 то кириллица в STemp не работает, файлы не находит
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
09.04.2013, 22:00 8
Если исходный текст в UTF-8, то сначала надо выполнить преобразование UTF-8 -> UnicodeString или UTF-8 -> AnsiString, а потом уже выполнять поиск в строке. Если в AnsiString преобразовывать, то можно применить вызов Utf8ToAnsi().
0
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
09.04.2013, 22:11 9
Цитата Сообщение от Mawrat Посмотреть сообщение
Если исходный текст в UTF-8, то сначала надо выполнить преобразование UTF-8 -> UnicodeString или UTF-8 -> AnsiString, а потом уже выполнять поиск в строке. Если в AnsiString преобразовывать, то можно применить вызов Utf8ToAnsi().
Да, исходный текст в UTF-8. Преобразование надо делать в функции поиска при чтении из файла? Исходные файлы надо оставить в UTF-8, их мне нельзя преобразовывать в AnsiString.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
09.04.2013, 22:19 10
Цитата Сообщение от tor2012 Посмотреть сообщение
Преобразование надо делать в функции поиска при чтении из файла?
Да - преобразовывать перед поиском. Сам исходный файл изменять не требуется. Т. е., вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //Загрузка данных из файла и поиск строки.
        try
          //Открываем файл в режиме чтения.
          Fs := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
          SetLength(S, Fs.Size);
          Fs.Read(S[1], Fs.Size);
          FreeAndNil(Fs);
          //Преобразование UTF-8 -> Ansi.
          S := Utf8ToAnsi(S);
          //Поиск заданной подстроки и установка флага.
          IsFound := AnsiPos(aTemp, S) > 0;
        except
          //Не удалось обработать файл: Sr.Name.
          IsFound := False;
        end;
1
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
10.04.2013, 19:10 11
Код работает но есть такие Warning:
Delphi
1
2
3
[DCC Warning] main.pas(7): W1005 Unit 'FileCtrl' is specific to a platform
[DCC Warning] main.pas(71): W1000 Symbol 'faVolumeID' is deprecated
[DCC Warning] main.pas(71): W1002 Symbol 'faVolumeID' is specific to a platform
Как от них избавиться?
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
10.04.2013, 19:16 12
Цитата Сообщение от tor2012 Посмотреть сообщение
Как от них избавиться?
не использовать модуль FileCtrl, но без него, все, что написано на предыдущей странице не особо имеет смысл - придется как-то самому описывать функции, взятые из этого модуля....
0
10.04.2013, 19:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2013, 19:16
Помогаю со студенческими работами здесь

Копирование txt файлов
вссем привет! нужно открыть один файл, потом открыть/очистить второй файл, скопировать первый во...

Вывести на экран список файлов txt из указанной папки, имеющих максимальное количество строк
Здравствуйте! Кто нибудь может помочь реализовать задачу ? Вывести на экран список файлов (.txt)...

Копирование файлов, указанных в .txt-файле
Имеется программа: считываются 2 директории (допустим &quot;a&quot; и &quot;b&quot;). В директории &quot;a&quot; не хватает...

Копирование файлов из 2-ух сравниваемых списков в .txt
Добрый день. Очень нужен батник, есть 2 папки в них файлы с подкаталогами. Надо первое!...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru