![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BackupWrite меняет размер файла? [Win2k, WinXP]
clickmaker © (2007-12-03 14:14:00)Если убрать все проверки и т.д., то скелет кода выглядит так
hSrc = CreateFile(lpSrc, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
hDest = CreateFile(lpDest, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
DWORD dwFileSizeLow = GetFileSize(hSrc, &dwFileSizeHigh);
dwBlockSize = dwFileSizeLow / 5;
copyBuff = (LPBYTE)HeapAlloc(Heap, HEAP_GENERATE_EXCEPTIONS, dwBlockSize);
BackupRead(hSrc, copyBuff, dwBlockSize, &dwBytesRead, FALSE, FALSE, &lpContextRead);
BackupWrite(hDest, copyBuff, dwBytesRead, &dwBytesWritten, FALSE, FALSE, &lpContextWrite);
...
запускаю в отладчике. dwBlockSize < размера файла. После первого выполнения BackupWrite размер целевого файла становится = размеру исходного, а до конца забивается нулями. Ни SetEndOfFile, ни другими способами явно размер целевого файла не меняю.
Ничё не понимаю...
clickmaker (2007-12-03 16:15:00) [1]
> [5] guav © (03.12.07 15:34)
ну, скажем, файл метров под 500 копируется, прервали, дабы потом докопировать. Чтобы осталось только то, что успели, а не весь файл забитый нулями до полного размера.
Хотя, тут поковырял BackupRead более подробно, там похоже нельзя с произвольного места возобновлять копирование, ибо потоки. Или можно, но пока не понял, как
guav (2007-12-03 15:34:00) [2]> Вопрос в том, как заставить копировать именно по кускам.
> Для случая, если прервали копирование большого файла...
Что-то я не понял опять. Какова задача ?
clickmaker (2007-12-03 14:47:00) [3]
> [3] guav © (03.12.07 14:30)
ну да, единственный вариант, откуда винда узнает размер исходного.
Вопрос в том, как заставить копировать именно по кускам. Для случая, если прервали копирование большого файла... можно, конечно, руками ставить SetEndOfFile, если нет других путей.
guav (2007-12-03 14:30:00) [4]А, вроде понял вопрос. Думаю, буфер содержит не только данные файла, но и всю копируемую информацию, иначе смысла не было бы в BackupWrite. Вот и размер там тоже.
clickmaker (2007-12-03 14:28:00) [5]
> [1] guav © (03.12.07 14:27)
да, это в конце. Но размер меняется уже после ПЕРВОГО вызова BackupWrite
while (...) {
BackupRead(hSrc, copyBuff, dwBlockSize, &dwBytesRead, FALSE, FALSE, &lpContextRead);
BackupWrite(hDest, copyBuff, dwBytesRead, &dwBytesWritten, FALSE, FALSE, &lpContextWrite);
}
BackupRead(hSrc, NULL, 0, NULL, TRUE, FALSE, &lpContextRead);
BackupWrite(hDest, NULL, 0, NULL, TRUE, FALSE, &lpContextWrite);
guav (2007-12-03 14:27:00) [6]Это учитывается ?
bAbort
[in] Indicates whether you have finished using BackupWrite on the handle. While you are restoring the file, specify this parameter as FALSE. After you are done using BackupWrite, you must call BackupWrite one more time specifying TRUE for this parameter and passing the appropriate lpContext. lpContext must be passed when bAbort is TRUE; all other parameters are ignored.