Главная страница
    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.031 c
14-1103568792
Profi
2004-12-20 21:53
2005.01.09
Возможно ли сделать на Pascal е


1-1103715953
_Anonimus_
2004-12-22 14:45
2005.01.09
Как можно выделить TListItem


14-1103293273
Alex_Petr
2004-12-17 17:21
2005.01.09
Перевод с C++ на Delphi


9-1095079255
maxz
2004-09-13 16:40
2005.01.09
Помогите найти файлы!


14-1103617210
07BB:080Dh
2004-12-21 11:20
2005.01.09
"Свобода слова" - что это такое?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский