Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1203318623
aistto
2008-02-18 10:10
2008.03.16
что с лейблом?


2-1202999893
ввв
2008-02-14 17:38
2008.03.16
Вопрос про сдвиги


15-1202464474
Kostafey
2008-02-08 12:54
2008.03.16
Как найти ветку форума по ее id?


6-1182991283
TryToGet
2007-06-28 04:41
2008.03.16
Поиск хоста через инет


2-1203005847
Ega23
2008-02-14 19:17
2008.03.16
CreateProcess - флаги





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский