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

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

да..  меняется..  не заметил...

Поделиться сообщением


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

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

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

Поделиться сообщением


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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
  • 0

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

Поделиться сообщением


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

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

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

Отредактировал Delpher-X

Поделиться сообщением


Ссылка на сообщение
  • 0

может у вас там открытие файлов doc после копирования....  поэтому он не может заменить открытый в другой программе файл...

Поделиться сообщением


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

может у вас там открытие файлов doc после копирования.... 

Однозначно нет. Тот код что я привел - конечный. 

 

Поделиться сообщением


Ссылка на сообщение
  • 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
4 минуты назад, Delpher-X сказал:

А Inc - это что?

инкремент значения Inc(I)  это  I:=I+1

Поделиться сообщением


Ссылка на сообщение
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От Вадим Смоленский
      В FireMonkey приходится перехватывать сообщения Windows, чтобы обеспечить корректное сворачивание и разворачивание окон. Это здесь уже обсуждалось. Я в итоге сделал у себя так:
      var TheFormIsMinimized: Boolean = False; TheFormWasMaximized: Boolean = False; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; begin if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTCLOSING) and (not TheFormIsMinimized) then begin TheFormIsMinimized := True; TheFormWasMaximized := (MainForm.WindowState=TWindowState.wsMaximized); SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_MINIMIZE, 0); MainFormp.WindowState := TWindowState.wsMinimized; end else if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTOPENING) and (TheFormIsMinimized) then begin TheFormIsMinimized := False; SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_RESTORE, 0); if TheFormWasMaximized then begin SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_MAXIMIZE,0); LookUp.WindowState:=TWindowState.wsMaximized; end else begin SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_RESTORE,0); LookUp.WindowState:=TWindowState.wsNormal; end; end else Result:=CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; Это работает — но восстановленное из трея окно находится не в фокусе. Пользователь должен дополнительно щелкнуть по нему мышкой. Вставка оператора SetFocus(FormToHWND(MainForm)) непосредственно сюда же ничего не дает — равно как и операторов SendMessage(FormToHWND(MainForm),WM_ACTIVATE,WA_ACTIVE,0),   Winapi.Windows.SetActiveWindow(FormToHwnd(MainForm)) или SetForegroundWindow(FormToHWND(MainForm)). Мне приходится запускать из этого места специальный таймер — и уже в обработчике таймера, после некоторой задержки, вызывать SetFocus(FormToHWND(MainForm)). Но и это работает не всегда. Например, если окно было развернуто на весь экран, а свернуто было щелчком по кнопке «Свернуть все окна», то после его разворачивания опять фокуса нет (насколько могу судить, в этом случае не запускается таймер). Нет ли более изящного и надежного способа наладить фокус?
    • От Yarpda
      Добрый день всем!
      Стоит задача сделать информационный киоск (управлений только через тачскрин) под управлением Windows. Фактически нужно на экран вывести сайт компании, но проблема в том что управление должно быть таким же как в мобильных устройствах.
      Т.е. реакция на касание как Pan (прокрутка). Если же собирать проект под винду, то при нажатии на экран и движении пальца прокрутка страницы в браузере не происходит, а происходит выделение текста на станице, а нужно максимально сделать как на мобильных платформах. Посмотрел настройки TWebBrowser и на VCL и на FMX, но ничего похоже не нашел, чтобы позволило так сделать. Если у кого-то была такая практика, или хотя бы знаете как это можно реализовать (желательно наиболее просто), прошу подсказки.
    • От Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • От Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • От Delpher-X
      У меня есть код, который должен скачивать файл с сайта: 
      var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.  
    • От Anatoliy_
      Приветствую
      Подскажите, планируется ли в RAD Studio возможность компиляции Delphi программ  для WebAssembly?
       
    • От Delpher-X
      Здравствуйте. У меня такая проблема. 
      Пытаюсь скачать файл:
       
      var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end;
      Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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