Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.035 c
14-1103189033
Кот Бегемот
2004-12-16 12:23
2005.01.09
Margaritas ante porcas


14-1103224286
Chuvak
2004-12-16 22:11
2005.01.09
ЖК-монитор и глаза


6-1098296927
papage
2004-10-20 22:28
2005.01.09
TIDHTTPSERVER, как слить файл


14-1103266234
KSergey
2004-12-17 09:50
2005.01.09
Кроссплатформенный исходник


11-1084936490
AlexZ_CRC
2004-05-19 07:14
2005.01.09
midi





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