Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.053 c
1-1103554339
Zeqfreed
2004-12-20 17:52
2005.01.09
Всплывающее окно


14-1103079144
Думкин
2004-12-15 05:52
2005.01.09
С днем рождения! 15 декабря


3-1102496164
msguns
2004-12-08 11:56
2005.01.09
Извлечение метаданных. Документация


14-1103634756
Gorlum
2004-12-21 16:12
2005.01.09
Задачи при приёме на работу


3-1102576934
Elena
2004-12-09 10:22
2005.01.09
IBSecurityService в interbase