Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как узнать что файл уже скопирован???


Автор: WaReZMEN 20.11.2007, 14:06
Дело в том что CopyFile возвращает результат, до того, как файл фактически будет скопирован. Поэтому, мне нужно быть уверенным что процесс копирования успеет завершиться. Сеичас я в программе делаю так

Код

  CopyFile(Pchar(extractFilePath(application.ExeName)+
              '111.exe'), Pchar(SaveDialog1.FileName), false);
Sleep(100);


Тоесть ставлю Sleep(100); Возможно есть другой способ???  smile 

Автор: orthrus 20.11.2007, 14:23
Можно реализовать процедуру CopyFile самому, т.е. написать новую процедуру которая будет копировать файлы. Таким образом можно будет проконтролировать процесс копирования файла.

Автор: MetalFan 20.11.2007, 14:34
WaReZMEN, эээ. а разве CopyFile асинхронная функция?

Автор: dumb 20.11.2007, 14:41
http://msdn2.microsoft.com/en-us/library/aa364439.aspx
или
http://msdn2.microsoft.com/en-us/library/aa363858.aspx+FILE_FLAG_NO_BUFFERING+копировать "руками"

а кстати, что ты такое делаешь, что у тебя "фактически не скопирован" получается? - флэшку выдергиваешь?.. для обычных потребителей(типа открыть,прочитать,итд) файл готов к пользованию сразу после выхода из CopyFile.

Автор: Alexeis 20.11.2007, 14:49
CopyFileEx - позволяет показать прогресс.

Автор: WaReZMEN 21.11.2007, 01:19
Alexeis, как????

Автор: Alexeis 21.11.2007, 01:33
Цитата(WaReZMEN @  21.11.2007,  01:19 Найти цитируемый пост)
Alexeis, как???? 

  А дока неа что?
Цитата(ms-help://borland.bds5/FileIO/fs/copyfileex.htm)

Copies an existing file to a new file, notifying the application of its progress through a callback function

Автор: WaReZMEN 21.11.2007, 01:39
Спасибо! А примерчика нету???  smile 

Автор: ama_kid 21.11.2007, 09:53
WaReZMEN, в принципе, MSDN разжевывает данную тему достаточно подробно. Есть только одна тонкость: в CopyFileEx передается параметр pbCancel, который должен быть указателем на переменную Boolean  и эта переменная не должна быть локальной...
Вот кусок выдранного откуда-то кода:
Код
function CopyProgressRoutine(
  TotalFileSize,
  TotalBytesTransferred,
  StreamSize,
  StreamBytesTransferred: LARGE_INTEGER;
  dwStreamNumber,
  dwCallbackReason: DWORD;
  hSourceFile,
  hDestinationFile: THandle;
  lpData: Pointer): DWORD; stdcall; // Соглашение о передаче параметров
begin
 // lpData содержит указатель, переданный в CopyFileEx, здесь это
 // указатель на ProgressBar1

 // Если началось копирование нового файла, изменим максимальный
 // порог для указателя прогресса
 if dwCallbackReason = CALLBACK_STREAM_SWITCH then
   TProgressBar(lpData).Max := TotalFileSize.QuadPart;

 // Установим новую позицию
 TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart;

 // Обновимся и копируем дальше
 Application.ProcessMessages;
 Result := PROGRESS_CONTINUE;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ch1, Ch2   : PChar;
  ErrCode    : Integer;
begin
 FCancelled := False;
 Ch1 := PChar(Edit1.Text);
 Ch2 := PChar(Edit2.Text);
 if CopyFileEx(Ch1, Ch2,
               @CopyProgressRoutine, // Указатель на call-back функцию
               ProgressBar1, @FCancelled, COPY_FILE_RESTARTABLE) then
     MessageDlg('Процесс копирования успешно завершен!', mtInformation, [mbOk], -1)
       else
         begin
           ErrCode := GetLastError;
           MessageDlg('В процессе копирования возникли ошибки!'#13#13'Код ошибки: '+
             IntToStr(ErrCode)+#13'Описание: '+SysErrorMessage(ErrCode)+'.', mtError, [mbOk], -1);
         end;
 ProgressBar1.Position := 0;
end;

Автор: WaReZMEN 21.11.2007, 09:57
ama_kid, спасибо!!! MSDN у меня нету.... Инсталяшка касячная...

Автор: Akella 21.11.2007, 11:06
Цитата(WaReZMEN @  20.11.2007,  14:06 Найти цитируемый пост)
Дело в том что CopyFile возвращает результат, до того, как файл фактически будет скопирован.

не можеть такого быть

Добавлено через 15 секунд
зачем тогда вообще результат возвращять?

Добавлено через 1 минуту и 14 секунд
ведь ещё не известно, скопирован он или нет, а результат уже функция отдаёт? она и сама-то не знает, что за результата будет, что она отдаст?

Автор: ama_kid 21.11.2007, 11:09
Цитата(WaReZMEN @  21.11.2007,  09:57 Найти цитируемый пост)
MSDN у меня нету....
Раз у тебя есть интернет (как-то ведь ты выходишь на форум smile) - значит у тебя есть и http://msdn2.microsoft.com/en-us/default.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)