C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сколько Времени...?
YanMinsk
Отправлено: 30.08.2004, 12:39


Не зарегистрирован







Народ, подскажите как узнать сколько времени будет копироваться файл (типа в файловых навигаторах, осталось времени ....)
Спасиба.
Konstantine
Отправлено: 30.08.2004, 13:13


Мастер участка

Группа: Модератор
Сообщений: 545



вообще-то скорость*размер_файла
где скорость=размер того что уже скопировано * время копирования.
но если успользовать стандартные функции копирования, то размер того что уже скопировано не достать.
для этого используй свою функцию (типа считать буфер — записать буфер и т.д.) но это может оказаться неэффективным способом.
exp
Отправлено: 30.08.2004, 21:59


Мастер участка

Группа: Участник
Сообщений: 304



QUOTE

вообще-то скорость*размер_файла
где скорость=размер того что уже скопировано * время копирования.

Интуиция подсказывает что
CODE

  скорость= размер_того_что_уже_скопировано/время_копирования

Лично для меня так понятней.
откуда
CODE

Время = Размер_файла/скорость
Konstantine
Отправлено: 31.08.2004, 08:14


Мастер участка

Группа: Модератор
Сообщений: 545



Ну ладно с формулами ошибся :-(, но суть в том что нада делать копирование вручную!!!
** avtoritet
Отправлено: 31.08.2004, 15:12


Не зарегистрирован







я БЫ сделал так:
1) Узнал бы какой объем копируемого файла скопировался за секунду
2) Потом разделил бы этот объем на объем копируемого файла(к примеру, получилось у нас 15 сек.)
3)Потом каждую секунду прибовлял к п. 1) по п.1)
Вот и все — показали общее время копирования и объем посекундного копирования предоставили. Это конечно если просс будет работать ровно. А так можно проверять каждую секунду.
Георгий
Отправлено: 31.08.2004, 19:52


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



изобретатели..

функция CopyFileEx чем не нравится?
тем, что время сама не считает?

CODE
void ShowLastError(void)
    {
  LPVOID lpMsgBuf;

  FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
   NULL,
   GetLastError(),
   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
   (LPTSTR) &lpMsgBuf,
   0,
   NULL
   );

   // Display the string.
   MessageBox( NULL,(char*) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

   // Free the buffer.
   LocalFree( lpMsgBuf );
    };

DWORD WINAPI CopyProgressRoutine(

   LARGE_INTEGER TotalFileSize, // total file size, in bytes
   LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred
   LARGE_INTEGER StreamSize, // total number of bytes for this stream
   LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
   DWORD dwStreamNumber, // the current stream
   DWORD dwCallbackReason, // reason for callback
   HANDLE hSourceFile, // handle to the source file
   HANDLE hDestinationFile, // handle to the destination file
   LPVOID lpData // passed by CopyFileEx
  )
  {
  Form1->CGauge1->MaxValue = TotalFileSize.LowPart;
  Form1->CGauge1->Progress = TotalBytesTransferred.LowPart;
  return PROGRESS_CONTINUE;
  };

void __fastcall TForm1::Button1Click(TObject *Sender)
{
const char * source="d:\\video\\FaceOff.avi";
const char * dest  ="d:\\copy.bin";

if ( !CopyFileEx(source, dest,CopyProgressRoutine , 0, 0, 0 ) )
       {
       ShowLastError();
       };
}

причём в вашем ведении — вызывать Application->ProcessMessages или выносить в отдельный поток.

Вернуться в Вопросы программирования в C++Builder