Перейти к содержанию
Fire Monkey от А до Я
  • 0

Программа пытается скопировать файл два раза


Delpher-X

Вопрос

Есть код для копирования файлов:

procedure TForm1.Timer2Timer(Sender: TObject);
var
FileIndex, FileName : String;
I : Integer;
begin
randomize;
FileIndex := IntToStr(random(5000));
for I := 0 to ListBox1.Items.Count-1 do
begin
FileIndex := IntToStr(StrToInt(FileIndex) + 1);
FileName := FileIndex + Exp;
TFile.Copy(ListBox1.Items[I], FileName);
end;
Timer2.Enabled := False;
end;

Когда я его запускаю, все работает, однако постоянно выскакивает сообщение об ошибке: specified file already exists, то есть копируемый файл уже существует. То есть, программа пытается каждый файл скопировать дважды. Вопрос: почему? С чем это связано и как от этого избавиться? 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
1 час назад, Delpher-X сказал:

С чем это связано и как от этого избавиться? 

конечно он не будет работать... вы пытаетесь копировать файлы из списка ListBox1 в один и тот же файл FileName... копирование для первого файла проходит, но для следующей операции копирования вы получите ошибку "такой файл уже существует".. если вам нужно перезаписывать файл при каждой операции копирования используйте TFile.Copy(ListBox1.Items, FileName, True)

что должен делать ваш код на самом деле? то, что я вижу, меня пугает...

Ссылка на комментарий
  • 0
1 минуту назад, slav_z сказал:

что должен делать ваш код на самом деле? то, что я вижу, меня пугает...

Просто найти файлы нужного типа и скопировать их на другой диск. 

Ссылка на комментарий
  • 0
6 минут назад, slav_z сказал:

если вам нужно перезаписывать файл при каждой операции копирования используйте TFile.Copy(ListBox1.Items, FileName, True)

Попробовал. Теперь выскакивает сообщение "Отказано в доступе". При этом, что самое смешное, файлы копируются! 

Ссылка на комментарий
  • 0
21 минут назад, Delpher-X сказал:

Просто найти файлы нужного типа и скопировать их на другой диск

Почему имя файла FileName не меняется для каждого файла из ListBox? Код из примера не реальный код? Где указание на другой "диск" (путь назначения)? Это все для Windows или Android?

Ссылка на комментарий
  • 0
9 минут назад, slav_z сказал:

Это все для Windows или Android?

Для Windows. 

9 минут назад, slav_z сказал:

Почему имя файла FileName не меняется для каждого файла из ListBox?

Так оно меняется: 

FileIndex := IntToStr(StrToInt(FileIndex) + 1);
FileName := FileIndex + Exp;
TFile.Copy(ListBox1.Items[I], FileName);

Вы все не о том спрашиваете. Главное - как убрать множественные сообщения об ошибках, которые вообще ни к селу ни к городу, так как файлы копируются. 

Ссылка на комментарий
  • 0
20 минут назад, Delpher-X сказал:

как убрать множественные сообщения об ошибках

скорее всего на исходных файлах из списка ListBox1 стоят атрибуты "Только для чтения"...  при копировании файлов атрибуты для новых файлов копируются тоже... поэтому первое копирование проходит, а следующие попытки не могут заменить файл т.к. он "только для чтения"...

Ссылка на комментарий
  • 0
2 минуты назад, slav_z сказал:

скорее всего на исходных файлах из списка ListBox1 стоят атрибуты "Только для чтения"... 

Вряд ли. Я лично их прекрасно изменяю

2 минуты назад, slav_z сказал:

поэтому первое копирование проходит, а следующие попытки не могут заменить файл т.к. он "только для чтения"...

В любом случае, мне и надо скопировать всего по одному разу. С какого перепугу, программа их копирует повторно? 

Ссылка на комментарий
  • 0
2 минуты назад, slav_z сказал:

тогда давайте проект вместе с файлами которые в ListBox1..  можете в личку...

Да это все обычные .doc файлы, которые у меня валяются на жестком диске. С тем же успехом, это могла бы быть коллекция JPEG-картинок с горячими красотками в бикини, сохраненных из Интернета. 

Изменено пользователем Delpher-X
Ссылка на комментарий
  • 0
1 минуту назад, slav_z сказал:

если есть антивирус...  он тоже может мешать...

Речь не идет об антивирусе. Речь идет о том, что код почему-то копирует файлы два раза. Хотя совершенно не должен этого делать. 

Ссылка на комментарий
  • 0

подозрение на таймер... (перенесите Timer2.Enabled := False; в начало метода, может он где то запускается повторно)

подозрение на функцию random()... почему именно так сделано получение начального индекса для файлов?

Ссылка на комментарий
  • 0

без вашего проекта можно долго гадать...  похожий код у меня работает без ошибок...

procedure TForm1.Button6Click(Sender: TObject);
var
  S: string;
  I: Integer;
begin
  I:=random(5000);
  for S in TDirectory.GetFiles(TDirectory.GetCurrentDirectory,'*.txt') do
  begin
    Inc(I);
    TFile.Copy(S,I.ToString+'.txt',True);
  end;
end;

 

Ссылка на комментарий
  • 0
1 минуту назад, slav_z сказал:

подозрение на таймер... (перенесите Timer2.Enabled := False; в начало метода, может он где то запускается повторно)

Тогда таймер просто вырубится раньше, чем что-то успеет сделать. 

Да и проблемный код заключен в begin - end; так что до выключения таймера дело даже не доходит. 

Ссылка на комментарий
  • 0
4 минуты назад, slav_z сказал:

подозрение на функцию random()... почему именно так сделано получение начального индекса для файлов?

Потому что я не знаю, как из строк ListBox'а, где лежит весь путь, выделить собственно само имя файла. 

Изменено пользователем Delpher-X
Ссылка на комментарий
  • 0
2 минуты назад, slav_z сказал:

без вашего проекта можно долго гадать...  похожий код у меня работает без ошибок...

Ну и где там ListBox? У меня же дело в том, что есть целый список файлов, а не один какой-то конкретный. 

Ссылка на комментарий
  • 0
5 минут назад, Delpher-X сказал:

Потому что я не знаю, как из строк ListBox'а, где лежит весь путь, выделить собственно само имя файла. 

TPath.GetFileName(ListBox1.Items)

 

Изменено пользователем slav_z
Ссылка на комментарий
  • 0
1 минуту назад, slav_z сказал:

TPath.GetFileName(ListBox1.Items)

Спасибо. Вообще интересная эта ваша IOUtils.... А вот конкретно этот код: 

 

10 минут назад, slav_z сказал:

for S in TDirectory.GetFiles(TDirectory.GetCurrentDirectory,'*.txt') do

он что именно делает? 

Ссылка на комментарий
  • 0
5 минут назад, Delpher-X сказал:

он что именно делает? 

цикл по текстовым файлам из указанной директории

для вас будет for S in TDirectory.GetFiles(TDirectory.GetCurrentDirectory,'*.doc') do

Изменено пользователем slav_z
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...