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 или выносить в отдельный поток.
|
|