Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
ВнизFastFileCopy Найти похожие ветки
← →
Vayrus (2008-02-11 14:24) [0]Здравствуйте, поделитесь, пожалуйста, исходниками для быстрого копирование файлов на API.
Я знаю как это сделать, используя CreateFile, но мой код не работает.
← →
clickmaker © (2008-02-11 14:53) [1]
> мой код не работает
соболезную
← →
slow!alfamoon!com (2008-02-11 15:51) [2]ну выложите свои сурсы что ли, ошибки посмотрим
← →
Vayrus (2008-02-11 23:15) [3]procedure FastFileCopy(FN1,FN2:String);
VAR
_fileDist, _fileSource : THandle;
j : cardinal;
_buff : char;
_temp : cardinal;
BEGIN
_fileSource := Createfile(pchar(FN1), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
SetFilePointer(_fileSource, GetFileSize(_fileSource, nil), nil, FILE_BEGIN);
_fileDist := CreateFile(pchar(FN2), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_NEW, 0, 0);
for j := 1 to GetFileSize(_fileSource, nil) do
begin
ReadFile(_fileSource, _buff, sizeOf(_buff), _temp, nil);
WriteFile(_fileDist, _buff, sizeOf(_buff), _temp, nil);
end;
CloseHandle(_fileDist);
CloseHandle(_fileSource);
end;
← →
Игорь Шевченко © (2008-02-11 23:23) [4]Vayrus (11.02.08 23:15) [3]
1. Где работа над ошибками ?
2. CopyFile не проще ?
SetFilePointer(_fileSource, GetFileSize(_fileSource, nil), nil, FILE_BEGIN);
Ты становишься в конец файла сразу после его открытия. Первое же чтение у тебя выдаст конец файла.
for j := 1 to GetFileSize(_fileSource, nil) do
Это не fastfilecopy, это slowfilecopy
Читать файл надо не по байту, а много байт - чем больше, тем лучше.
Копай в сторону CopyFile - там уже все предусмотрено заранее.
← →
ketmar © (2008-02-12 00:20) [5]а чем, собственно, CopyFile[Ex]() не устроила? она умеет много гитик (в том числе и таких, о которых ты просто не знаешь). зачем велосипед лепить?
---
Understanding is not required. Only obedience.
← →
Riply © (2008-02-12 02:18) [6]> [4] Игорь Шевченко © (11.02.08 23:23)
> Читать файл надо не по байту, а много байт - чем больше, тем лучше.
Я бы выразилась так: для "невырожденного" файла существует размер,
на котором функция зависимости скорости поблочного копирования
от размера блока достигает максимума.
И шансов, что он(размер блока) равен одному байту практически нет.
:)
> Копай в сторону CopyFile - там уже все предусмотрено заранее.
"Такую процедурку стоит писать хотя бы ради одного самообразования." (с)
:)
> [0] Vayrus (11.02.08 14:24)
Прислушайся к советам, данным в
[4] Игорь Шевченко © (11.02.08 23:23) и [5] ketmar © (12.02.08 00:20).
Ибо для написания "универсальной" ф-ии "fastfilecopy",
требуется учитывать слишком много различных моментов, не всегда очевидных.
Разобраться с ними со всеми - ой какое "неблагодарное занятие". :)
← →
Германн © (2008-02-12 02:25) [7]
> Riply © (12.02.08 02:18) [6]
> для "невырожденного"
Повеяло моей молодостью. А вот что повеяло, как повеяло, чем повеяло не пойму. Склероз, блин. :)
← →
ketmar © (2008-02-12 02:29) [8]>[6] Riply © (2008-02-12 02:18:00)
вот если бы CopyFile() ещё и файловые потоки умела… или умеет, а я запамятовал?
---
Understanding is not required. Only obedience.
← →
Джо © (2008-02-12 02:33) [9]> [8] ketmar © (12.02.08 02:29)
> >[6] Riply © (2008-02-12 02:18:00)
> вот если бы CopyFile() ещё и файловые потоки умела… или
> умеет, а я запамятовал?
>
> ---
> Understanding is not required. Only obedience.
Ex — умеет.
← →
ketmar © (2008-02-12 02:44) [10]>[9] Джо © (2008-02-12 02:33:00)
угу. мне казалось, что какая-то из них должна это делать, читал. но я ж на ДМ, зачем мне в MSDN лезть? тут всё найдут и расскажут. %-)
---
Understanding is not required. Only obedience.
← →
Slym © (2008-02-12 04:50) [11]
/******************************************************************************
Module: FileCopy.cpp
Notices: Copyright (c) 2000 Jeffrey Richter
Programming Server-Side Applications for MS Windows 2000
******************************************************************************/
BOOL FileCopy(PCTSTR pszFileSrc, PCTSTR pszFileDst) {
BOOL fOk = FALSE; // Assume file copy fails
LARGE_INTEGER liFileSizeSrc = { 0 }, liFileSizeDst;
try {
{
// Open the source file without buffering & get its size
CEnsureCloseFile hfileSrc = CreateFile(pszFileSrc, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL);
if (hfileSrc.IsInvalid()) goto leave;
// Get the file"s size
GetFileSizeEx(hfileSrc, &liFileSizeSrc);
// Non-buffered I/O requires sector-sized transfers.
// I"ll use buffer-size transfers since it"s easier to calculate.
liFileSizeDst.QuadPart = chROUNDUP(liFileSizeSrc.QuadPart, BUFFSIZE);
// Open the destination file without buffering & set its size
CEnsureCloseFile hfileDst = CreateFile(pszFileDst, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, hfileSrc);
if (hfileDst.IsInvalid()) goto leave;
// File systems extend files synchronously. Extend the destination file
// now so that I/Os execute asynchronously improving performance.
SetFilePointerEx(hfileDst, liFileSizeDst, NULL, FILE_BEGIN);
SetEndOfFile(hfileDst);
// Create an I/O completion port and associate the files with it.
CIOCP iocp(0);
iocp.AssociateDevice(hfileSrc, CK_READ); // Read from source file
iocp.AssociateDevice(hfileDst, CK_WRITE); // Write to destination file
// Initialize record-keeping variables
CIOReq ior[MAX_PENDING_IO_REQS];
LARGE_INTEGER liNextReadOffset = { 0 };
int nReadsInProgress = 0;
int nWritesInProgress = 0;
// Prime the file copy engine by simulating that writes have completed.
// This causes read operations to be issued.
for (int nIOReq = 0; nIOReq < chDIMOF(ior); nIOReq++) {
// Each I/O request requires a data buffer for transfers
chVERIFY(ior[nIOReq].AllocBuffer(BUFFSIZE));
nWritesInProgress++;
iocp.PostStatus(CK_WRITE, 0, &ior[nIOReq]);
}
// Loop while outstanding I/O requests still exist
while ((nReadsInProgress > 0) || (nWritesInProgress > 0)) {
// Suspend the thread until an I/O completes
ULONG_PTR CompKey;
DWORD dwNumBytes;
CIOReq* pior;
iocp.GetStatus(&CompKey, &dwNumBytes, (OVERLAPPED**) &pior, INFINITE);
switch (CompKey) {
case CK_READ: // Read completed, write to destination
nReadsInProgress--;
pior->Write(hfileDst); // Write to same offset read from source
nWritesInProgress++;
break;
case CK_WRITE: // Write completed, read from source
nWritesInProgress--;
if (liNextReadOffset.QuadPart < liFileSizeDst.QuadPart) {
// Not EOF, read the next block of data from the source file.
pior->Read(hfileSrc, &liNextReadOffset);
nReadsInProgress++;
liNextReadOffset.QuadPart += BUFFSIZE; // Advance source offset
}
break;
}
}
fOk = TRUE;
}
leave:;
}
catch (...) {
}
← →
Slym © (2008-02-12 04:50) [12]
/******************************************************************************
Module: FileCopy.cpp
Notices: Copyright (c) 2000 Jeffrey Richter
Programming Server-Side Applications for MS Windows 2000
******************************************************************************/
BOOL FileCopy(PCTSTR pszFileSrc, PCTSTR pszFileDst) {
BOOL fOk = FALSE; // Assume file copy fails
LARGE_INTEGER liFileSizeSrc = { 0 }, liFileSizeDst;
try {
{
// Open the source file without buffering & get its size
CEnsureCloseFile hfileSrc = CreateFile(pszFileSrc, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL);
if (hfileSrc.IsInvalid()) goto leave;
// Get the file"s size
GetFileSizeEx(hfileSrc, &liFileSizeSrc);
// Non-buffered I/O requires sector-sized transfers.
// I"ll use buffer-size transfers since it"s easier to calculate.
liFileSizeDst.QuadPart = chROUNDUP(liFileSizeSrc.QuadPart, BUFFSIZE);
// Open the destination file without buffering & set its size
CEnsureCloseFile hfileDst = CreateFile(pszFileDst, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, hfileSrc);
if (hfileDst.IsInvalid()) goto leave;
// File systems extend files synchronously. Extend the destination file
// now so that I/Os execute asynchronously improving performance.
SetFilePointerEx(hfileDst, liFileSizeDst, NULL, FILE_BEGIN);
SetEndOfFile(hfileDst);
// Create an I/O completion port and associate the files with it.
CIOCP iocp(0);
iocp.AssociateDevice(hfileSrc, CK_READ); // Read from source file
iocp.AssociateDevice(hfileDst, CK_WRITE); // Write to destination file
// Initialize record-keeping variables
CIOReq ior[MAX_PENDING_IO_REQS];
LARGE_INTEGER liNextReadOffset = { 0 };
int nReadsInProgress = 0;
int nWritesInProgress = 0;
// Prime the file copy engine by simulating that writes have completed.
// This causes read operations to be issued.
for (int nIOReq = 0; nIOReq < chDIMOF(ior); nIOReq++) {
// Each I/O request requires a data buffer for transfers
chVERIFY(ior[nIOReq].AllocBuffer(BUFFSIZE));
nWritesInProgress++;
iocp.PostStatus(CK_WRITE, 0, &ior[nIOReq]);
}
// Loop while outstanding I/O requests still exist
while ((nReadsInProgress > 0) || (nWritesInProgress > 0)) {
// Suspend the thread until an I/O completes
ULONG_PTR CompKey;
DWORD dwNumBytes;
CIOReq* pior;
iocp.GetStatus(&CompKey, &dwNumBytes, (OVERLAPPED**) &pior, INFINITE);
switch (CompKey) {
case CK_READ: // Read completed, write to destination
nReadsInProgress--;
pior->Write(hfileDst); // Write to same offset read from source
nWritesInProgress++;
break;
case CK_WRITE: // Write completed, read from source
nWritesInProgress--;
if (liNextReadOffset.QuadPart < liFileSizeDst.QuadPart) {
// Not EOF, read the next block of data from the source file.
pior->Read(hfileSrc, &liNextReadOffset);
nReadsInProgress++;
liNextReadOffset.QuadPart += BUFFSIZE; // Advance source offset
}
break;
}
}
fOk = TRUE;
}
leave:;
}
catch (...) {
}
← →
Игорь Шевченко © (2008-02-12 09:48) [13]Slym © (12.02.08 04:50) [11]
Я могу выложить много интересных текстов на разных языках, но смысл ?
← →
Slym © (2008-02-12 10:33) [14]Игорь Шевченко © (12.02.08 9:48) [13]
Человек просил быстро... быстрее "многопоточного" (поток один) некуда...
← →
Vayrus (2008-02-12 12:43) [15]Всем спасибо. Так я понял что указатель надо перевести в начало файла,
т. е. вместо размера исходного файла вписать нуль. Просто изначально на этом же форуме говорилось, что данный код (на API) самый быстрый, не помню кем, но это не важно. Вот и захотелось написать самому относительно
простую функцию по быстрому копированию файлов, чтобы размер программы был минимален. А может у кого есть функция копирования файлов
Delphi + Assembler?
← →
Игорь Шевченко © (2008-02-12 12:46) [16]
> простую функцию по быстрому копированию файлов, чтобы размер
> программы был минимален. А может у кого есть функция копирования
> файлов
> Delphi + Assembler?
CopyFile[Ex] - все уже написано.
> Просто изначально на этом же форуме говорилось, что данный
> код (на API) самый быстрый
Не всему верь, что прочитаешь на этом форуме
← →
Palladin © (2008-02-12 12:47) [17]
program Project1;
{$APPTYPE CONSOLE}
uses
Windows;
begin
CopyFile("cc","dd",True);
end.
удивись размеру файла
p.s.: все уже давно написано и практической цели твои велосипеды не имеют, только в академических целях.
← →
ketmar © (2008-02-12 13:26) [18]>[15] Vayrus (2008-02-12 12:43:00)
слушай, дарагой, зачем тебе ассемблер? это несолидно. крутые перцы заказывают специализированые суперкомпьютеры для копирования!
хинт: читать про узкие места, медитировать на информацию о том, что узкое место в данном случае скорость HDD и затраты на вызов API (переход между кольцами защиты процессора).
---
Understanding is not required. Only obedience.
← →
ketmar © (2008-02-12 13:26) [19]>[18] ketmar © (2008-02-12 13:26:00)
>переход между кольцами защиты процессора
ой. зачем я это написал? щаз начнут требовать код, который работает в ring0…
---
Understanding is not required. Only obedience.
← →
Бегущий человек © (2008-02-18 03:54) [20]C++ mustdie...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c