Перейти к содержанию
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 минуту назад, slav_z сказал:

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

TDirectory.GetCurrentDirectory, это если я не ошибаюсь, получение текущей директории приложения, ведь так? 
Ссылка на комментарий
  • 0
13 минут назад, Delpher-X сказал:

получение текущей директории приложения, ведь так?

ага

можете указать там свою директорию где лежат ваши doc файлы

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

вот ваш код с ListBox...  все работает без ошибок

procedure TForm1.FormCreate(Sender: TObject);
begin
  Exp:='.txt';
  ListBox1.Items.AddStrings(TDirectory.GetFiles(TDirectory.GetCurrentDirectory,'*'+Exp));
end;

procedure TForm1.Button1Click(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;

проверьте ВСЕ ваши файлы doc на наличие флага "только для чтения"...  место на диске есть?... без вашего проекта сложно угадать причину...

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

ListBox1.Items.AddStrings(TDirectory.GetFiles(TDirectory.GetCurrentDirectory,'*'+Exp));

То есть, вот эта строка  будет искать все файлы с указанным расширением? А вместо TDirectory.GetCurrentDirectory можно указать например, 'C:/'?

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

То есть, вот эта строка  будет искать все файлы с указанным расширением? А вместо TDirectory.GetCurrentDirectory можно указать например, 'C:/'?

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

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

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

Не, не работает. Когда я написал: ListBox1.Items.AddStrings(TDirectory.GetFiles('C:/', '*'+Exp)); ListBox просто остался девственно чист. 

 

 

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

смотрите причину у себя.. 

значение Exp указано?

в корне диска С точно есть такие файлы?

после нигде нет очистки ListBox?

394504165_.thumb.png.3e430cb039fd6eaa9bd666cdb222b26f.png

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

значение Exp указано?

Указано. 

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

в корне диска С точно есть такие файлы?

Так мне нужен не только корень, но и вложенные каталоги. 

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

после нигде нет очистки ListBox?

Нет. 

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

Так мне нужен не только корень, но и вложенные каталоги. 

тогда понятно... эта функция только из определенного каталога файлы получает... ща попробую..

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

ListBox1.Items.AddStrings(TDirectory.GetFiles('c:/','*'+Exp,TSearchOption.soAllDirectories));

но работать она будет не быстро..  ей надо всю структуру диска С обойти...

лучше ее в отдельном потоке запускать...

 

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

но работать она будет не быстро..  ей надо всю структуру диска С обойти...

лучше ее в отдельном потоке запускать...

У меня используется такой код: 

procedure TForm1.FindFilePattern(root, pattern: String);
var
SR:TSearchRec;
begin
root:=IncludeTrailingPathDelimiter(root);
  if FindFirst(root+'*.*',faAnyFile,SR) = 0 then
  begin
      repeat
          Application.ProcessMessages;
          if ((SR.Attr and faDirectory) = SR.Attr ) and (pos('.',SR.Name)=0) then
             FindFilePattern(root+SR.Name,pattern)
          else
          begin
           if pos(pattern,SR.Name)>0 then Form1.ListBox1.Items.Add(Root+SR.Name);
          end;
      until FindNext(SR)<>0;
  end;
end;
FindFilePattern(DiskName, Exp);

Однако, в любом случае, вопрос о заполнении ListBox не стоит. Вопрос стоит в том, почему программа копирует файлы два раза. 

Ссылка на комментарий
  • 0
procedure TForm1.Timer2Timer(Sender: TObject);
var
FileIndex, FileName : String;
I : Integer;
begin
Timer2.Enabled := False;
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;
end;

А так?

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

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

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

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

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

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

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

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

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

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