Перейти к содержанию
  • 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 эмодзи.

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

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

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


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

    • От 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, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
    • От slav_z
      Есть ли проблемы с запуском приложений на macOS Big Sur у Delphi 10.4.1? Очень страшно обновлять macOS...
    • От destroyer86
      Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
      Теперь сам вопрос в JavaInterfaces.pas есть описание:
       
      JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
      JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
      Вот пример кода на Java, который хочу реализовать в Delphi:
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
    • От Вадим Смоленский
      Отчего-то, если задать TMediaPlayer.FileName с расширением "mp4", то уже при запуске приложение валится с сообщением "Unsupported media file". Причем в секции initialization юнита FMX.Media.Win присутствует и при запуске отрабатывает такой оператор:
      TMediaCodecManager.RegisterMediaCodecClass('.mp4', SVMP4Files, TMediaType.Video, TWindowsMediaCodec);
      Запускаю под Windows. Файлы *.avi проигрываются без проблем
    • От Мурат Бештоков
      Использую Delphi 10.3.
      Запускаю код программы, все работает.
      Как только увеличиваю размеры матриц, программа прекращает работу. В чем может быть проблема?
    • От Ihor Matlak
      У меня проблема с модальными формами VCL в Firemonkey проекте. Когда VCL форма вызвана ShowModal, и пользователь параллельно с панели задач вызывает другую программу, по возвращении к моей модалка падает под программу и поднять ее невозможно. Помогите может у кого было такое. Помогите пожалуйста
  • Последние посетители   0 пользователей онлайн

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

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