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

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

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


Ссылка на сообщение
  • 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;

А так?

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


Ссылка на сообщение
  • 0
3 часа назад, juppy сказал:

Не c:/ a c:\

Функция просто не видит ваш путь.

без разницы... windows понимает и туда и обратно...

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


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

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

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

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

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

  Разрешено использовать не более 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 пользователей онлайн

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

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