Page 1 of 2 1 2 LastLast
Results 1 to 15 of 22

Thread: Deletefile werkt niet (Access Denied)

  1. #1

    Deletefile werkt niet (Access Denied)

    In mijn applicatie maak ik op een lokale locatie een kopie van een pdf.
    Deze wordt als stream door mijn applicatie geopend en uit gelezen.
    Hierna wordt de stream gesloten.
    Vervolgens wil ik deze lokale kopie weer verwijderen.

    Hiervoor gebruik ik de SystUtils.DeleteFile(tempFile) function

    Echter hiermee wordt de file niet verwijderd en krijg ik de foutmelding Acces Denied.
    Als ik de file handmatig via de verkenner verwijder werkt het wel (oo als mijn applicatie nog actief is)

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    In welke map sla je die PDF op en welke rechten staan er op die map ingesteld?
    En als je je applicatie nou met admin rechten start?
    TMemoryLeak.Create(Nil);

  3. #3
    Ik heb meerdere locaties geprobeerd.
    Ik heb de default app locatie deze staat op Onedrive(Documents), maar ook een test in de map waar de executable staat geeft dezelfde problemen.
    Het vreemde is sowieso dat ik wel een file op die locatie mag aanmaken maar niet mag verwijderen.
    Zodra ik de applicatie als admin uitvoer krijg ik weer hele andere problemen (geen toegang tot een netwerkschijf waar het origineel staat)

  4. #4
    Kan het zijn dat een antivirus programma misschien roet in het eten gooit?

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by cpri View Post
    deze staat op Onedrive(Documents), [...] (geen toegang tot een netwerkschijf waar het origineel staat)
    Bij iedere installatie van Windows is OneDrive het eerste dat ik verwijder; het is namelijk geen "Echte" drive.
    Ik denk ook dat daar ergens je probleem ligt: heb je geprobeerd je bestand op te slaan in een echte map, bijvoorbeeld ergens in "Mijn Documenten" of gewoon een tijdelijk aangemaakte temp-map vanaf de root (C:\Temp of zo) met volledige rechten voor alle gebruikers?

    Een ander ideetje: gebruik je een TFileStream of een TMemoryStream (met SaveToFile aan het einde)?
    Bij de eerste moet je er zeker van zijn dat hij ge-freed is, voordat je hem kunt verwijderen.

    Wij schrijven (in een programma dat 24/7 door honderden gebruikers wordt gebruikt) facturen als PDF op een soortgelijke manier weg naar de Windows %TEMP%-map voordat ze verzonden worden en ervaren daar nooit problemen mee.
    TMemoryLeak.Create(Nil);

  6. #6
    bedankt voor de tips.

    De optie met c:\temp had ik al een keer gerprobeerd met met het zelfde resultaat
    Wellicht is idd de optie om het bestand via een Filestream te kopieeren een alternatief.
    Ik ga er eens naar kijken

  7. #7
    Quote Originally Posted by cpri View Post
    In mijn applicatie maak ik op een lokale locatie een kopie van een pdf.
    Deze wordt als stream door mijn applicatie geopend en uit gelezen.
    Hierna wordt de stream gesloten.
    Vervolgens wil ik deze lokale kopie weer verwijderen.

    Hiervoor gebruik ik de SystUtils.DeleteFile(tempFile) function

    Echter hiermee wordt de file niet verwijderd en krijg ik de foutmelding Acces Denied.
    Als ik de file handmatig via de verkenner verwijder werkt het wel (oo als mijn applicatie nog actief is)
    De DeleteFile() wordt natuurlijk vrij snel na het sluiten van de stream gedaan.

    Kun je eens voor de DeleteFile een delay inbouwen van, laten we zeggen, 20 seconden.
    (net zoveel tijd als dat je zou verwijderen via de verkenner en dat het dan wel lukt)

    Anders wordt het een kwestie om met process explorer van sysinternals te kijken of er een handle open staat op die file.

  8. #8
    SysUtils.DeleteFile geeft een boolean terug, geen error. Gebruik je niet per ongeluk een andere functie, of zit de fout misschien ergens anders?
    Last edited by GolezTrol; 01-Mar-23 at 13:09.
    1+1=b

  9. #9
    Die file zal dan toch in use zijn, heb je al eens met handles of process explorer (beide van sysinternals) gekeken welk process de file open heeft?

  10. #10
    Zoekt en gij zult vinden! of in dit geval meer: worstel en kom boven.

    De file wordt van schijf geopend in een stream, via een pdf viewer wordt deze op het scherm getoond.
    Wanneer je door gaat naar de volgende stap wordt de pdfviewer leeg gemaakt en de stream gefreed. Daarna wordt de file verwijderd.
    Dit ging dus steeds mis (Access Denied)
    Heb nu een FreeAndNil gedaan op de stream daarna kan de file gewoon verwijderd worden.

  11. #11
    Klopt maar in de functie zelf kan je wel kijken wat de error message is (getlatestError)

    Mmmhh dit was dus een reply op de opmerking van Goleztrol

  12. #12
    Bizar. Free zou al het werk moeten doen. FreeAndNil zou daarnaast alleen de meegegeven object reference nil moeten maken, wat niets te maken heeft met het in gebruik zijn van de file.

    Ik zou denken dat er dan eerst iets niet goed was rondom het aanroepen van Free, of dat er heel misschien wat geks zit in het mixen van objecten en interfaces, of dat het toeval is dat het na die aanpassing wel werkt (iets met een hoeveelheid tijd die het OS nodig heeft om de file verwijderbaar te maken na het sluiten van de stream).

    M.a.w. ik ben wat sceptisch over deze oplossing
    Maar goed, als het werkt dan werkt het.
    1+1=b

  13. #13
    Heel raar. TFileStream.Free zou de file toch echt moeten sluiten en de handle vrijgeven. Waarschijnlijk is er iets anders raars in de code waardoor dit komt en hack (lees: los je het op) met de FreeAndNil.

    LOL Jos. We posten het precies tegelijk

  14. #14
    Nog even een update.
    Wanneer je de file kopieerd met de CopyFile functie werkt bovenstaande dus niet
    Ik kopieer nu de file volgens onderstaande methode en dan gaat het wel goed.

    Code:
      FileStream:=TMemoryStream.Create;
      FileStream.LoadFromFile(S);
      FileStream.SaveToFile(FPDFPath);
      FileStream.free;
    Mocht je je afvragen waarom ik hiervoor geen TFileStream gebruik, deze kent geen SaveToFile vandaar maar met een TMemeoryStream opgelost

  15. #15
    Quote Originally Posted by cpri View Post
    Nog even een update.
    Wanneer je de file kopieerd met de CopyFile functie werkt bovenstaande dus niet
    Dan zit er dus in je code waar je CopyFile gebruikt iets mis.

    Maar goed... TMemoryStream werkt ook (maar dan moet je geen hele hele grote bestanden hebben).

    Waarom overigens niet gewoon de Copy in IOUtils gebruiken?
    Delphi Code:
    1. uses IOUtils;
    2. //..
    3. IOUtils.Copy(S, FPDFPath);

    (die gebruikt overigens de onderliggende Windows API CopyFile)

Page 1 of 2 1 2 LastLast

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
  •