Текущий архив: 2005.01.09;
Скачать: CL | DM;
Вниз
Reset(f) Найти похожие ветки
← →
Илья (2004-12-19 08:15) [0]На определённом вызове процедуры Reset(F, 1) возникает ошибка file access denied
код:
var
CurDirID, CurFileID : INTEGER;
InFile, OutFile : FILE;
FRes : INTEGER;
BytesReaden, BytesWritten : INTEGER;
BytesToCopy : INTEGER;
TotalBytesCopied : Int64;
TotalSize : Int64;
TotalBadBytes : Int64;
Buffer : PChar;
InFileName, OutFileName : STRING;
begin
//Setting buffer size
BytesToCopy := 10 * 1024 * 1024; //Buffer size = 1 MB
Total_Corrupt_Files := 0;
//Creating dirs
CurDirID := 0;
while CurDirID < FAF.get_TotalDirs do
begin
ForceDirectories(FAF.Calc_Path(DestinationDir, ExtractRelativePath(SourceDir, FAF.DirArray[CurDirID])));
Inc(CurDirID);
end;
//Copying files
Stopped := FALSE;
GlobalTotalBytesCopied := 0;
GlobalTotalBadBytes := 0;
CurFileID := 0;
while (CurFileID < FAF.get_TotalFiles) and (not Stopped) do
begin
//File names
InFileName := FAF.FileArray[CurFileId];
OutFileName := FAF.Calc_Path(DestinationDir, ExtractRelativePath(SourceDir, InFileName));
//Input file does not exists
if not FileExists(InFileName) then
begin
Inc(CurFileId);
Continue;
end;
//Assign files
FileMode := fmOpenReadWrite or fmShareExclusive;
AssignFile(InFile, InFileName);
AssignFile(OutFile, OutFileName);
Reset(InFile, 1);
ReWrite(OutFile, 1);
TotalSize := FileSize(InFile);
//Copying all file
TotalBytesCopied := 0;
TotalBadBytes := 0;
while (TotalBytesCopied < TotalSize) and (not Stopped) do
begin
GetMem(Buffer, BytesToCopy);
BlockRead(InFile, Buffer^, BytesToCopy, BytesReaden);
FRes := IOResult;
if FRes = 0 then
begin
BlockWrite(OutFile, Buffer^, BytesReaden, BytesWritten);
Inc(TotalBytesCopied, BytesWritten);
end;
Dispose(Buffer);
end;
//Closing files
CloseFile(InFile);
CloseFile(OutFile);
Inc(CurFileID);
end;
← →
Palladin © (2004-12-19 08:18) [1]Забыл добавить сколько заплатишь за ответ.
← →
Palladin © (2004-12-19 08:37) [2]
> BytesToCopy := 10 * 1024 * 1024; //Buffer size = 1 MB
Проблемы с понятием мегабайта
> //Copying files
> Stopped := FALSE;
> GlobalTotalBytesCopied := 0;
> GlobalTotalBadBytes := 0;
> CurFileID := 0;
> while (CurFileID < FAF.get_TotalFiles) and (not Stopped)
> do
> begin
> //File names
> InFileName := FAF.FileArray[CurFileId];
> OutFileName := FAF.Calc_Path(DestinationDir, ExtractRelativePath(SourceDir,
> InFileName));
>
> //Input file does not exists
> if not FileExists(InFileName) then
> begin
> Inc(CurFileId);
> Continue;
> end;
>
> //Assign files
> FileMode := fmOpenReadWrite or fmShareExclusive;
> AssignFile(InFile, InFileName);
> AssignFile(OutFile, OutFileName);
> Reset(InFile, 1);
> ReWrite(OutFile, 1);
> TotalSize := FileSize(InFile);
>
> //Copying all file
> TotalBytesCopied := 0;
> TotalBadBytes := 0;
> while (TotalBytesCopied < TotalSize) and (not Stopped)
> do
> begin
> GetMem(Buffer, BytesToCopy);
> BlockRead(InFile, Buffer^, BytesToCopy, BytesReaden);
> FRes := IOResult;
>
> if FRes = 0 then
> begin
> BlockWrite(OutFile, Buffer^, BytesReaden, BytesWritten);
> Inc(TotalBytesCopied, BytesWritten);
> end;
>
>
> Dispose(Buffer);
> end;
>
> //Closing files
> CloseFile(InFile);
> CloseFile(OutFile);
> Inc(CurFileID);
> end;
Вся эта чушь,
мне особенно понравилось с выделением и освобождением памяти в цикле, за это сразу в ссылку на камчатку надо,
FileMode := fmOpenReadWrite or fmShareExclusive; создает впечатление что человек знает что делает, но судя по вопросу - нихрена не знает,
Stopped к чемуто приплетено, хотя нигде нет и намека что это используется.
FRes := IOResult;
if FRes = 0 then
begin
BlockWrite(OutFile, Buffer^, BytesReaden, BytesWritten);
Inc(TotalBytesCopied, BytesWritten);
end;
тоже создается впечатление о знании, которого нет, это никогда не исполнится ({$I-}+F1), хотя может это присутствует за пределами функции, но в таком случае это неразумно.
cводится к:For i:=0 to FAF.get_TotalFiles-1 Do
CopyFile(FAF.FileArray[CurFileId],FAF.Calc_Path(DestinationDir, ExtractRelativePath(SourceDir, InFileName));
← →
begin...end © (2004-12-19 09:57) [3]> Илья (19.12.04 08:15)
> На определённом вызове процедуры Reset(F, 1) возникает ошибка
> file access denied
Происходит это из-за ошибки доступа к определённому файлу. Вы же явно указываете режим доступа:
> FileMode := fmOpenReadWrite or fmShareExclusive
Т.е., Вы хотите, чтобы Вам разрешили читать из файла InFile, писать в него, и ещё и запрещаете другим делать это. А зачем всё это, если Вы из этого файла только читаете?
И про память буфера Вы уже задавали вопрос (http://delphimaster.net/view/1-1102946209/). Теперь уже ошибка не возникает, но зачем же на каждом проходе цикла эту самую память выделять/освобождать? Достаточно один раз выделить и один раз освободить - за пределами цикла, ведь и размер буфера всегда один и тот же. Так будет гораздо быстрее.
← →
Илья (2004-12-20 14:22) [4]
> И про память буфера Вы уже задавали вопрос (http://delphimaster.net/view/1-1102946209/).
> Теперь уже ошибка не возникает, но зачем же на каждом проходе
> цикла эту самую память выделять/освобождать? Достаточно
> один раз выделить и один раз освободить - за пределами цикла,
> ведь и размер буфера всегда один и тот же. Так будет гораздо
> быстрее.
Действительно, как-то не подумал.
Спасибо большое.
С уважением, Илья.
Страницы: 1 вся ветка
Текущий архив: 2005.01.09;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.031 c