Toon posts:

[VB.NET 2005] Delete map: Access to path denied

Pagina: 1
Acties:
  • 135 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,
Ik wil een map compleet verwijderen, dus incl submappen en files.
De applicatie opent ook processen op het formulier, zoals word en adobe enzo.
De map die ik wil verwijderen bevat dus word en/of adobe bestanden.
Dus de processen moeten eerst gesloten worden alvorens de delete actie kan worden aangeroepen.
Ik heb van alles geprobeerd en ik blijf een aantal fouten krijgen:
- het bestand kan niet worden verwijderd omdat het door een ander proces in gebruik is
- access to the path "..." denied
- toegang geweigerd ( na kill actie )

ik moet er nog bij zeggen dat het proces in een user control draait die op het formulier is geimplementeerd, vandaar die UcOpenApp1.
hieronder zal ik de code die ik nu nog heb even kopieeren:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    Private Sub frmDocument_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Not UcOpenApp1.p Is Nothing Then
            UcOpenApp1.p.Kill()
        End If
        Call AC_DeleteDirectory("C:\Temp\Mapnaam")
    End Sub

Public Function AC_DeleteDirectory(ByVal dir_name As String)
        Dim file_name As String
        Dim files As Collection
        Dim i As Integer

        ' Get a list of files it contains.
        files = New Collection
        file_name = Dir$(dir_name & "\*.*", vbReadOnly + _
            vbHidden + vbSystem + vbDirectory)
        Do While Len(file_name) > 0
            If (file_name <> "..") And (file_name <> ".") Then
                files.Add(dir_name & "\" & file_name)
            End If
            file_name = Dir$()
        Loop

        ' Delete the files.
        For i = 1 To files.Count
            file_name = files(i)
            ' See if it is a directory.
            MsgBox(file_name)
            If GetAttr(file_name) And vbDirectory Then
                ' It is a directory. Delete it.
                AC_DeleteDirectory(file_name)
            Else
                IO.File.Delete(files(i))
            End If
        Next i

        RmDir(dir_name)
    End Function

Mijn gedachte hierbij is: ik sluit eerst proces dat nog runt, dan verwijder ik de bestanden en dan de volledige map.
Ik zit ook met het probleem dat de gebruiker meerdere processen kunnen openen, maar ik wil het eerst met 1 proces openen proberen.
Ik hoop dat iemand mij hierbij kan helpen

[ Voor 8% gewijzigd door Verwijderd op 13-11-2006 16:18 ]


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 17:12

CodeIT

Code IT

Als je zelf de processen hebt geopend in je eigen code kun je de handles (of het proces object) toch bijhouden en deze dan killen (of het document dat je hebt geopend unloaden)?
Verder is er in het .NET 2.0 framework een handig object, namelijk het directory object. Ongeveer 3/4 van je code kun je vervangen door
code:
1
io.Directory.Delete("C:\Temp\Mapnaam",TRUE)
Dit verwijdert recursief alle bestanden en directories.
Verder lijk je ook nog eens veel gebruik te maken van VB6 code, terwijl de meeste functies (bijv. Dir$) vervangen zijn door mooie OO objecten.

Verwijderd

Topicstarter
CodeIT schreef op maandag 13 november 2006 @ 12:15:
Als je zelf de processen hebt geopend in je eigen code kun je de handles (of het proces object) toch bijhouden en deze dan killen (of het document dat je hebt geopend unloaden)?
Verder is er in het .NET 2.0 framework een handig object, namelijk het directory object. Ongeveer 3/4 van je code kun je vervangen door
code:
1
io.Directory.Delete("C:\Temp\Mapnaam",TRUE)
Dit verwijdert recursief alle bestanden en directories.
Verder lijk je ook nog eens veel gebruik te maken van VB6 code, terwijl de meeste functies (bijv. Dir$) vervangen zijn door mooie OO objecten.
Ja dat heb ik ook al geprobeerd, maar gaf ook de melding: access to path ".." denied
En deze functie heb ik op internet gevonden en niet zelf geschreven.
Voordat ik de directory delete doe ik eerst het geopende proces killen, als ik dat niet doe krijg ik de foutmelding: "pad+bestandsnaam" is door een ander proces geopend".
Doe ik hem wel eerst killen en daarna verwijderen krijg ik de melding access to path ".." denied.
Deze melding krijg ik zelfs al open ik geen proces. Er is iets wat het verwijderen van die map en bestanden denied, maar ik weet niet wat. Als ik via verkenner de map wil verwijderen is het geen probleem. En neem ik een andere map dan "C:\Temp\Mapnaam" dan kan ik wel de bestanden + map verwijderen. Ik hoop dat deze extra toelichting jullie helpt om mij misschien te kunnen helpen.

Verwijderd

Topicstarter
Iemand nog een idee in welke richting ik dit probleem kan zoeken ?

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Na een korte zoektocht op google:
The Kill method executes asynchronously. After calling the Kill method, call the WaitForExit method to wait for the process to exit, or check the HasExited property to determine if the process has exited.
Op het moment dat je de directory wilt verwijderen is het process ws nog bezig met afsluiten.

Verwijderd

Topicstarter
PhysicsRules schreef op woensdag 15 november 2006 @ 11:16:
Na een korte zoektocht op google:


[...]

Op het moment dat je de directory wilt verwijderen is het process ws nog bezig met afsluiten.
Ik heb dat hasExited een keer gebruikt ja om te testen, en het klopt inderdaad dat het even duurt voordat die true wordt. Ik zou dat een if lus kunnen inbouwen en pas de delete uitvoeren als hasExited true is. Ik ga het even proberen. Alvast bedankt en ik post zo het resultaat

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In de quote die hij aanhaalt staat toch dat je gewoon WaitForExit methode moet gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op woensdag 15 november 2006 @ 11:40:
In de quote die hij aanhaalt staat toch dat je gewoon WaitForExit methode moet gebruiken.
die heb ik gebruikt, maar zonder resultaat. Hij blijft de foutmelding geven:
access to path ".." denied.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 15 november 2006 @ 12:32:
[...]
die heb ik gebruikt, maar zonder resultaat. Hij blijft de foutmelding geven:
access to path ".." denied.
Dan heeft een ander process dus de files gelocked.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op woensdag 15 november 2006 @ 16:09:
[...]

Dan heeft een ander process dus de files gelocked.
Ik heb geprobeerd de file te unlocken met de volgende code:
Visual Basic:
1
2
3
Dim FS As FileStream = New FileStream(file_name, FileMode.Create, FileAccess.Write, FileShare.Write)
      fs.Unlock(0, 100)
      MsgBox("Unlocked")

maar dan krijg ik de error weer: access to the path ".." denied.
dat is gebaseerd op de 1e regel van deze code, het aan willen maken van die filestream.
ik heb ook een programma genaamd process explorer daarmee kan je zien door welk proces het in gebruik is en als ik daar zoek op die file dan krijg ik niks, en als ik in task manager kijk zie ik ook dat word bijvoorbeeld wat het proces gebruikt weer sluit na de kill actie. Dus bij de delete actie is word afgesloten. Zoals ik het zie, zijn er geen processen maar die het bestand gebruiken.
Is er geen functie in vb.net waarbij je kan controlen door middel van een string locatie of die door een proces wordt gebruikt ? dan kan ik kijken of dat bestand nog gebruikt wordt.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

ik heb goede ervaringen met de gratis applicatie http://ccollomb.free.fr/unlocker/. Misschien dat die je kan helpen op te sporen welke applicatie de bestanden blijft locken.

Verwijderd

Topicstarter
PhysicsRules schreef op woensdag 15 november 2006 @ 17:01:
ik heb goede ervaringen met de gratis applicatie http://ccollomb.free.fr/unlocker/. Misschien dat die je kan helpen op te sporen welke applicatie de bestanden blijft locken.
Bedankt voor het programma, heb het geinstalleerd en tijdens het runnen van mijn vb.net applicatie gekeken met Unlocker of de file/map gelocked is, maar Unlocker geeft aan: Er is geen Blokkerend Process gevonden. maar Unlocker kan u toch helpen met dit object.
Alleen als ik een bestand via mijn applicatie open, een word document bijvoorbeeld en dan ga kijken met Unlocker dan geeft ie wel aan dat Word het process geblokkeerd heeft. Als ik dan vervolgens met Unlocker het process beeindig of vrijgeeft en dan via mijn applicatie de map + files wil verwijderen krijg ik weer de error access to path ".." denied. Ik zie dan wel in mijn applicatie Word sluiten.

Ik weet onderhand niet meer wat het is hoor, heb van alles geprobeerd. Process is niet in gebruik, bestand is niet gelocked, wat kan het nog meer zijn ? De bestanden die ik wil verwijderen staan lokaal en niet op een server of dergelijke dus ik heb gewoon alle rechten om de map te verwijderen.
Want ik kan ook gewoon de map verwijderen als ik die error krijg of op elk willekeurig moment.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Als ik het goed begrijp, doet je applicatie dus ook bewerkingen op word-documenten die zich in die folder bevinden, en daarna wil je die folder verwijderen ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 21 november 2006 @ 10:38:
Als ik het goed begrijp, doet je applicatie dus ook bewerkingen op word-documenten die zich in die folder bevinden, en daarna wil je die folder verwijderen ?
Ik zal uitleggen waar ik het voor gebruik. Het is een document beheer systeem. Gebruikers kunnen documenten opslaan, en deze documenten worden ge-encrypt opgeslagen.
Bij het openen van een document wordt het gedcrypt en naar een tijdelijke map geschreven op C:\.
En bij het sluiten van de applicatie wordt eerst het proces afgesloten ( word bijvoorbeeld ) en vervolgens alle files in de map verwijderd en vervolgens de totale map. Maar ik blijf maar dezelfde error krijgen van: access to path "..." denied. Het bestand wat verwijderd moet worden is niet gelocked en niet door een proces in gebruik.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Met wat open je je Word documenten ? En hoe geef je dat object vrij ?
Probeer eens met
code:
1
Marshal.ReleaseComObject

je document-objecten vrij te geven

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 21 november 2006 @ 13:56:
Met wat open je je Word documenten ? En hoe geef je dat object vrij ?
Met een shell process. En ik doe process.kill en process.waitforexit().
dat process vrijgeven gaat wel goed lijkt me, want heb met 2 verschillende applicaties gekeken of het proces nog in gebruik is maar dat is niet zo en ik kan de map in verkenner gewoon verwijderen.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Even een ander spoor: kan het zijn dat je applicatie om een of andere reden geen modify rechten op de map heeft? Kun je bijvoorbeeld een bestand verwijderen dat niet door Word of Adobe gebruikt is?

Verwijderd

Topicstarter
PhysicsRules schreef op dinsdag 21 november 2006 @ 16:42:
Even een ander spoor: kan het zijn dat je applicatie om een of andere reden geen modify rechten op de map heeft? Kun je bijvoorbeeld een bestand verwijderen dat niet door Word of Adobe gebruikt is?
Ik heb er een .txt bestandje ingezet en dan kan ik via de applicatie wel de file verwijderen.
Maar probeer ik het word document te verwijderen zonder dat bestand via de applicatie te openen dan lukt dat niet, dan krijg je weer access to path ".." denied. Ook vanuit een ander project krijg ik diezelfde foutmelding. Als ik het bestand kopieer en in een andere map zet op de andere harde schijf en dan probeer te verwijderen krijg ik weer die foutmelding. In mijn ogen betekent dat, dat vb.net iets met het bestand doet zodat je het via de applicatie niet meer kan verwijderen, alleen nog maar via verkenner.
En nogmaals: het bestand is niet in gebruik van een proces en is niet gelocked, dat heb ik getest.
Ik hoop dat jullie hier iets aan hebben.

Verwijderd

Topicstarter
Eindelijk heb ik de oplossing gevonden. Ik zocht via google op vb.net delete directory with force. Ik dacht probeer dat eens en toen na een paar websites kwam ik op een pagina en die gebruikte de library kernel32. Dat doet blijkbaar de delete actie forceren.
De code zal ik nog even plakken voor de liefhebbers:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

    Public Sub DeleteProfileFolder(ByVal UserHomeDir As String)
        Try
            Dim Folder As String
            Dim File As String
            Dim fso As New FileSystemObject

            For Each Folder In Directory.GetDirectories(UserHomeDir)
                For Each File In Directory.GetFiles(Folder)
                    DeleteFile(File)
                    fso.DeleteFile(File, True)
                Next
                DeleteProfileFolder(Folder)
            Next
            Try
                fso.DeleteFolder(UserHomeDir)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        Catch Ex As Exception
            MsgBox(Ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub

Ik heb hem zelf uitgebreid met de fso.deletefile en fso.deletefolder om daadwerkelijk de map te verwijderen. Na 1 week zweten en ploegen is het eindelijk gelukt :*)
Pagina: 1