Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2014, 22:00   #1
crayzi_skript
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 14
Вопрос Как скопировать несколько рекурсивно найденых одинаковых файлов из ListBox в определенную директорию

Всем привет. Есть код который рекурсивно ищет по маске допустим файл 1.txt . Этот файл мне нужно скопировать в определенный директорию. Как быть если нашлось несколько таких файлов, например c:1.txt и c:\games\1.txt и более . Как в таком случае скопировать оба найденных файла в нужную директорию*?


Вот сам код рекурсивного поиска файла :
Код:
procedure FindFiles(StartFolder, Mask: String; List: TStrings;
ScanSubFolders: Boolean = True);
var
SearchRec: TSearchRec;
FindResult: Integer;
begin
List.BeginUpdate;
try
StartFolder:=IncludeTrailingBackslash(StartFolder);
FindResult:=FindFirst(StartFolder+'*.*', faAnyFile, SearchRec);
try
while FindResult = 0 do with SearchRec do begin
if (Attr and faDirectory)>0 then begin
if ScanSubFolders and (Name<>'.') and (Name<>'..') then
FindFiles(StartFolder+Name, Mask, List, ScanSubFolders);
end else begin
if MatchesMask(Name, Mask) then List.Add(StartFolder+Name);
end; 
FindResult:=FindNext(SearchRec);
end; 
finally
FindClose(SearchRec);
end;
finally 
List.EndUpdate;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
FindFiles('C:', '1.txt', ListBox1.Items, true);
Label1.Caption := IntToStr(ListBox1.Items.Count);
end;

end.

Последний раз редактировалось crayzi_skript; 14.09.2014 в 22:18. Причина: вместо директорию написал категорию))
crayzi_skript вне форума Ответить с цитированием
Старый 14.09.2014, 22:05   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Копировать функция CopyFile
Если несколько - делай разные имена на выходе, добавляя к имени например так:
1_1.txt
1_2.txt и т.д.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.09.2014, 22:09   #3
crayzi_skript
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 14
По умолчанию

можете мне подсказать код, ну чтоб автоматом переименовывалось?
примерно так я и думал, только пока знаний реализовать это не хватает...

Последний раз редактировалось crayzi_skript; 14.09.2014 в 22:17.
crayzi_skript вне форума Ответить с цитированием
Старый 14.09.2014, 22:27   #4
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Цитата:
c:1.txt и c:\games\1.txt и более
Цитата:
Если несколько - делай разные имена на выходе, добавляя к имени например так 1_1.txt
1_2.txt и т.д.
А лучше так с_1.txt c_games_1.txt - чтоб хоть знать, какой файл откуда взят
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 14.09.2014, 22:36   #5
crayzi_skript
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 14
По умолчанию

этот вариант был бы идеален с_1.txt c_games_1.txt
но если бы я мог сам реализовать то не писал бы сюда) подскажите как сделать
crayzi_skript вне форума Ответить с цитированием
Старый 14.09.2014, 23:06   #6
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Нет, не идеален Я совсем забыл про допустимую длину пути к файлу, куда входит и его имя. Так что рано или поздно ваша программка даст сбой. Наверное лучше будет создавать текстовик-описатель в папке назначения, куда будут скидываться исходные пути, к примеру: 1_2.txt=c:\games\1.txt и т.д.
Просто как пример-
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
file_name, new_file_name: PWideChar;
begin
tag:=tag+1;
file_name:='C:/1.txt';
new_file_name:=PChar('D:/1_'+inttostr(tag)+'.txt');
copyFile(file_name, new_file_name, true);
end;
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 14.09.2014, 23:20   #7
crayzi_skript
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 14
По умолчанию

спасибо. а как же все таки прикрутить к моему проекту копирование файлов с их переименовыванием с листбокса в нужный каталок, допустим с:\temp?
crayzi_skript вне форума Ответить с цитированием
Старый 14.09.2014, 23:38   #8
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Так я постом выше привел образец, только у меня там таймер, а вам нужно будет сделать цикл
Код:
for i:=0 to ListBox1.items do
Begin
file_name:=PChar(ListBox1.items[i]);
new_file_name:=PChar('D:/1_'+inttostr(i)+'.txt');
copyFile(file_name, new_file_name, true);
End;
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 14.09.2014, 23:41   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
можете мне подсказать код, ну чтоб автоматом переименовывалось?
примерно так я и думал, только пока знаний реализовать это не хватает...
Код:
// Поиск уникального имени файла в папке AFolder
function GetUniqueFileName(const AFolder, APrefix, AExtention: string): string;
var
  Index: Integer;
begin
  Index:= 1;
  repeat
    Result:= IncludeTrailingPathDelimiter(AFolder) + APrefix + IntToStr(Index) + AExtention;
    Inc(Index);
  until not FileExists(Result);
end;
Вот ещё, из другого проекта скопипастил:
Код:
function TMainForm.ExtractFileNameOnly(const AFileName: string): string;
var
  Index, PointPos: Integer;
begin
  // Извлечение из пути имени файла без расширения
  Result:= ExtractFileName(AFileName);

  PointPos:= 0;
  for Index:= Length(Result) downto 1 do
    if Result[Index] = '.'
      then begin
             PointPos:= Index;
             Break;
           end;

  if PointPos <> 0
    then Result:= Copy(Result, 1, PointPos - 1);
end;

function TMainForm.GetUniqueFileName(const AFileName: string): string;
var
  Template, Ext: string;
  Index: Integer;
begin
  // Поиск уникального имени файла для сохранения
  Result:= AFileName;
  Template:= ExtractFilePath(AFileName) + ExtractFileNameOnly(AFileName);
  Ext:= ExtractFileExt(AFileName);
  Index:= 2;

  while FileExists(Result) do
    begin
      Result:= Format('%s-%d%s', [Template, Index, Ext]);
      Inc(Index);
    end;
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 14.09.2014 в 23:48.
min@y™ вне форума Ответить с цитированием
Старый 14.09.2014, 23:55   #10
crayzi_skript
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Foreseen Посмотреть сообщение
Так я постом выше привел образец, только у меня там таймер, а вам нужно будет сделать цикл
Код:
for i:=0 to ListBox1.items do
Begin
file_name:=PChar(ListBox1.items[i]);
new_file_name:=PChar('D:/1_'+inttostr(i)+'.txt');
copyFile(file_name, new_file_name, true);
End;
спасибо. попробую
crayzi_skript вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать имена выбранных файлов в Listbox? @лeся Microsoft Office Word 35 30.01.2012 20:31
Работа с файлами и директориями. Как копировать директорию с ее содержимым в другую директорию??? Дмитрий_Попов Общие вопросы C/C++ 1 14.12.2011 21:49
Копирование найденых файлов Delphi leonw Общие вопросы Delphi 7 11.01.2010 23:19
как загрузить в ListBox несколько текстовых файлов? One.Love Общие вопросы Delphi 5 14.01.2008 11:54