![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetMem функция [D7, WinXP]
Илья © (2004-12-13 16:56:00)У меня есть код, выполняющий кэшированое копирование массива отдельных файлов. Примерно на 580 цикле копирования возникает Access Violation. Какова моя ошибка?
Вот мой код:
var
CurFileID : INTEGER;
ReadFileName, WriteFileName : STRING;
TotalSize : INTEGER;
ReadFileHandle, WriteFileHandle : INTEGER;
Buffer : POINTER;
TotalBytesCopied, BytesCopied, BytesToCopy : Int64;
begin
BytesToCopy := 10 * 1024 * 1024; //10 MB - buffer size
CurFileID := 0;
while CurFileID < TotalFiles do
begin
//File names
ReadFileName := Array[CurFileId];
WriteFileName := 'C:\copyto\'+ReadFileName;
//Checking file for existance
if not FileExists(ReadFileName) then
begin
Inc(CurFileId);
Break;
end;
//Handles
ReadFileHandle := FileOpen(ReadFileName, fmOpenRead);
WriteFileHandle := FileCreate(WriteFileName, fmOpenWrite);
TotalSize := FileSeek(ReadFileHandle, 0, 2);
//Copying all file
TotalBytesCopied := 0;
while TotalBytesCopied < TotalSize do
begin
GetMem(Buffer, BytesToCopy);
//Reading
FileSeek(ReadFileHandle, TotalBytesCopied, 0);
BytesCopied := FileRead(ReadFileHandle, Buffer^, BytesToCopy);
//Writing
FileWrite(WriteFileHandle, Buffer^, BytesCopied);
Inc(TotalBytesCopied, BytesCopied);
Inc(CurFileID);
end;
//Closing files
FileClose(ReadFileHandle);
FileClose(WriteFileHandle);
Dispose(Buffer);
end;
end;
Илья (2004-12-13 18:39:00) [1]
> А чем CopyFile не устраивает, зачем изобретать велосипед?
Просто у меня там есть специальный алгоритм по предварительной обработке перед записью :)
> Подозрительно, что у Вас память выделяется в цикле, а освобождается
> за его пределами (т.е. только последний выделенный кусок
> памяти).
Спасибо огромное!
Вот так всегда из-за невнимательности теряется огромное кол-во времени.
begin...end (2004-12-13 18:06:00) [2]> Илья (13.12.04 16:56)
Подозрительно, что у Вас память выделяется в цикле, а освобождается за его пределами (т.е. только последний выделенный кусок памяти).
Leonid Troyanovsky (2004-12-13 18:01:00) [3]
> Илья (13.12.04 16:56)
> У меня есть код, выполняющий кэшированое копирование массива
А в чем глубинный смысл "кэшированного копирования"?
> Access Violation. Какова моя ошибка?
Все просто: ты обращаешся к нераспределенной тобой памяти.
--
С уважением, LVT.
Palladin (2004-12-13 17:37:00) [4]А чем CopyFile не устраивает, зачем изобретать велосипед?