Results 1 to 9 of 9

Thread: Error 5 (acces denied).

  1. #1
    Registered User
    Join Date
    Nov 2021
    Location
    Noord-Hooland
    Posts
    7

    Error 5 (acces denied).

    Beste forumleden,

    ik raak een beetje gefrustreerd van de volgende code:

    Code:
      {$I-}
       iCnt := 0;                                              // Integer
       bOke := False;                                       // Boolean
       repeat
          Application.ProcessMessages;
          wIOResult := IOResult;                       // wIOResult: Word 
          if (not bOke) and (iCnt > 0) then
              CloseFile(fp);                                 // fp: File  
    
          ShowMessage(Format('1. wIOResult = %d', [wIOResult]));
    
          AssignFile(fp, sFile);                           // String;
          System.FileMode := 0;
    
          wIOResult := IOResult;
          ShowMessage(Format('2. wIOResult = %d', [wIOResult]));
    
          // Open the file, recordsize = 1 byte
          System.Reset(fp, 1);
    
          wIOResult := IOResult;
          ShowMessage(Format('3. wIOResult = %d', [wIOResult]));
    
          bOke := (wIOResult = 0);
          if (bOke) then
              Break;
    
          Inc(iCnt);
       until (iCnt = 3);
       {$I+}
    
       if (not bOke) or (iCnt = 3) then begin
           ShowMessage('Oeps, 4 x geprobeerd......');
       end;
    Als ik aan de variable sFile een (windows-s) bestandsnaam toeken en het programma draait gaat het goed. Ken ik daarna een andere bestandsnaam toe, gaat het goed. Ken ik daarna weer de eerste bestandsnaam toe (een rawimage in het NEF formaat), dan krijg ik IOError nummer 5. Access-denied. Zeer vreemd want dat NEF bestand wordt door geen ander proces vast gehouden. De fout treedt op NA System.Reset(fp,1). IOResult is dan 5.
    Voor zover ik weet kun je een file maar in 3 modi openen (0: Readonly, 1: writeonly en 2: readwrite).
    Mijn programma is de voortzetting van een oud programma en alles vervangen door TFileStream lukt nu even niet.

    Mijn vraag is: is er een mogelijkheid om er zeker van te zijn dat de variable fp (FILE) gesloten is voordat ik hem gebruik? (If Unassigned(fp) then... helpt niet.
    Ik weet het even niet meer. Is er iemand bekend met het openen/lezen van binaire files in Lazarus?

    Windows 10/x64
    Lazerus 2.0.12
    FPC: 3.2.0
    8 GB ram, intel I5 2.3 Ghz.

    Groetjes
    Tinus

  2. #2
    Quote Originally Posted by Tinis63 View Post
    Mijn vraag is: is er een mogelijkheid om er zeker van te zijn dat de variable fp (FILE) gesloten is voordat ik hem gebruik?
    Het gaat ook niet om de variabele fp. Die zal wel lokaal zijn dus undefined. Maar het gaat erom dat de file niet gesloten is. Er blijft dan een filehandle op open staan (en dan kan geen enkel ander process of jijzelf opnieuw die file openen tenzij je opent in shared mode).

    Maar je hebt daarop toch al je antwoord? (Je krijgt een error 5 op ioresult uitlezing wanneer deze file nog geopend was) Je moet je programma dan dus nakijken waarom die file niet gesloten wordt of een nette melding geven bij ioresult 5 dat de gebruiker het bestand nog moet afsluiten.

  3. #3
    Registered User
    Join Date
    Nov 2021
    Location
    Noord-Hooland
    Posts
    7
    Quote Originally Posted by rvk View Post
    Het gaat ook niet om de variabele fp. Die zal wel lokaal zijn dus undefined. Maar het gaat erom dat de file niet gesloten is. Er blijft dan een filehandle op open staan (en dan kan geen enkel ander process of jijzelf opnieuw die file openen tenzij je opent in shared mode).

    Maar je hebt daarop toch al je antwoord? (Je krijgt een error 5 op ioresult uitlezing wanneer deze file nog geopend was) Je moet je programma dan dus nakijken waarom die file niet gesloten wordt of een nette melding geven bij ioresult 5 dat de gebruiker het bestand nog moet afsluiten.
    Je hebt gelijk dat het bestand "tijdig" gesloten moet worden. De variable fp (type FILE) wordt elders gedeclareerd en verdop in de code weer gesloten (CloseFile(fp), hier niet weergegeven). Wat ik zo vreemd vind is dat het de allereerste keer WEL goed gaat, vervolgens 1 of meerdere, andere berstanden open hetgeen ook goed gaat (waar ik uit concludeer dat fp wel degelijk gesloten wordt), en open ik daarna weer het eerste bestand dan treedt error 5 op. Het lijkt er op dat de filehandle naar dat specifieke bestand blijft bestaan.

    Maar je hebt gelijk, ik zal IOREsult uitlezen NA CloseFile(fp). In ieder geval dank voor je antwoord.

  4. #4
    Ja, zonder complete code is het wat lastig te zeggen waar het probleem precies zit

    Je moet je in ieder geval realiseren dat je na ELKE low level IO call je die IOResult uit moet lezen (of zeker moet weten dat ie geslaagd is). Als je dat niet doet... dan blijft die waarde nl in IOResult staan en faalt de volgende calls ook allemaal.

    Het is ook beter om de {$I-} en {$I+} alleen om die ene call te zetten (en niet om meer code). En daarna IOResult uit te lezen.

    Zie https://www.pascal-programming.info/lesson8.php#jump5

    Het kan dus zijn dat de error al veel eerder in een programma zit (bij calls zonder IOResult uitlezing) in plaats van bij de laatste call (waar je wel IOResult controleert).

  5. #5
    inderdaad te weinig code en zeker gezien het gebruik van Application.ProcessMessages kan re-entering van dat stukje code alsnog plaats vinden.
    oor zover ik weet kun je een file maar in 3 modi openen (0: Readonly, 1: writeonly en 2: readwrite).
    https://docwiki.embarcadero.com/Libr...eStream.Create Er bestaan meer dan alleen die drie mode om te openen. Er is ook een share mode zoals in de link te vinden.

    PS Zie net dat het Lazarus is Ook daar is er een share mode https://lazarus-ccr.sourceforge.io/d...am.create.html

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Aangezien het een image bestand is, zit de explorer of search indexing er misschien voor thumbnails in te rommelen ?

  7. #7
    Registered User
    Join Date
    Nov 2021
    Location
    Noord-Hooland
    Posts
    7
    Quote Originally Posted by marcov View Post
    Aangezien het een image bestand is, zit de explorer of search indexing er misschien voor thumbnails in te rommelen ?
    Oeps, mijn fout . (schaamrood op de kaken). Het lezen in Readonly mode, werd aangeroepen vanuit een andere procedure. In deze procedure werd het bestand ook al gelezen met behulp van een Filestream (Stream := TFileStream.Create(UTF8ToSys(sFoto), fmOpenRead or fmShareExclusive);
    En hoewel deze stream ook weer netjes werd opgeruimd VOOR het lowlevel lezen, hield Windows kennelijk voor *nef files toch een filehandle of zo vast. Probleem opgelost door NA het sluiten van de stream een Delay van 10 ms en een Application.ProcessMessages te geven.

    Dank allen voor het meedenken.

  8. #8
    Utf8ToSys in Lazarus is een no-op in Windows.
    Niet erg, want aangezien alle strings UTF8 zijn is de vertaling naar UTF16 (voor de systeemaanroep in TFileStream.Create) transparant en lossless.

    Bart

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by Bart B View Post
    Utf8ToSys in Lazarus is een no-op in Windows.
    Alleen met -dEnableUTF8RTL _OF_ de manifest oplossing. De eerste is wel default voor nieuwe apps, al zou ik de tweede aanraden voor nieuwe apps (want dan is ook de Windows unit in principe utf8)

    Probleem opgelost door NA het sluiten van de stream een Delay van 10 ms en een Application.ProcessMessages te geven.
    Dat is een tikje krap. Locks kunnen seconden blijven bestaan, vooral als de explorer op die map open is, en veel plugins heeft en/of het antivirus/smartscreen aggressief is afgesteld

    Voor hetzelfde probleem gebruikt FPC's fpmake/fpmkunit constructies zoals dit:

    Delphi Code:
    1. // There were reports of RemoveDir failing due to locking-problems. To solve
    2.     // these the RemoveDir is tried three times, with a delay of 5 seconds. See
    3.     // bug 21868
    4.     retries := 2;
    5.     result := RemoveDir(ADirectoryName);
    6.     while not result and (retries>0) do
    7.       begin
    8.         log(vlWarning, SWarnRetryRemDirectory, [ADirectoryName]);
    9.         sleep(5000);
    10.         dec(retries);
    11.         result := RemoveDir(ADirectoryName);
    12.       end;
    Last edited by marcov; 01-Dec-21 at 12:34.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •