Announcement

Collapse
No announcement yet.

Proplem bei der Methode GetFiles

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Proplem bei der Methode GetFiles

    Hey gutn morgn ich suche schon seit ewigkeiten nach einer Lösung für mein Problem und zwar:

    Ich möchte gerne von einenm Pfad alle Ordner durchsuchen und mir die Dateien(dll/ocx) holen. Doch jedesmal wenn ich zu dem Ordner "System Volume Infromation" komme bekomm ich ne UnauthorizedAccessException. Meine frage kann ich die Methode GetFiles so ändern das sie den Ordner auslässt oder muss ich jetzt ne eigene Prozedur schreiben um zu Prüfen ob ich den Ordner lesen darf.

    Bei VB6 ging GetFiles noch da hat die Methode solche Ordner noch ausgeschlossen

    Danke
    Zuletzt editiert von Co3dr; 09.12.2011, 10:22.

  • #2
    Die rekursive Version von Getfiles bricht tatsächlich immer bei nicht zugreifbaren Ordnern ab. Du mußt leider die nichtrekursive Version nehmen und die Rekursion selbst implementieren.

    Comment


    • #3
      Ich hab da son Ansatz und zwar las ich mir vom Ordner die Sicherheiten ausgeben und wenn da nur System drin ist überspring ich diesen Ordner, wenn ich fertig bin poste ich mal den Code

      Comment


      • #4
        Hier ist der Code zum auslesen der Rechte eines Ordners

        [highlight=vb.net]
        Dim oFolder As New DirectoryInfo(psSearchpath)
        Dim aListOfFiles As New List(Of System.IO.FileSystemInfo)
        Dim aSecurityCollection As Security.AccessControl.AuthorizationRuleCollection
        Dim sUser As String = System.Security.Principal.WindowsIdentity.GetCurre nt().Name
        Dim account As New Security.Principal.NTAccount(sUser)
        Dim oSecurity As System.Security.AccessControl.DirectorySecurity
        Dim sPermission() As String

        aListOfFiles.AddRange(oFolder.GetFileSystemInfos)

        For Each oFile As System.IO.FileSystemInfo In aListOfFiles

        oSecurity = Directory.GetAccessControl(oFile.FullName)
        aSecurityCollection = oSecurity.GetAccessRules(True, True, account.GetType)

        'In der aSecurityCollection stehen alle benutzer und Ihre Rechte(Kann man mit for each abfragen). Aber da man nur Wissen will,
        'darin SYSTEM eingetragen ist steht hier 1.
        If aSecurityCollection.Count = 1 Then
        sPermission = aSecurityCollection.Item(0).IdentityReference.Valu e.Split(CChar("\"))

        'Hier wird der String sPermission überprüft ob das item am Index(1) "SYSTEM" ist.
        If sPermission(1) Like "SYSTEM" Then
        MsgBox("Kein Zugriff auf " & oFile.FullName)
        aListOfFiles.Remove(oFile)
        Continue For
        End If
        End If
        Next
        [/highlight]
        Zuletzt editiert von gfoidl; 12.12.2011, 13:33. Reason: VB.net-Tags

        Comment


        • #5
          Wenn du nur eine Version von GetFiles schreiben willst die nicht abbricht gehst du glaube ich mit einer Rechte Prüfung zu weit bzw. am Problem vorbei. Es gibt ja auch andere Gründe warum ein File/Directory nicht lesbar ist (defekt, liegt auf einem gerade nicht verfügbaren Network-share, ein anderes Programm hat gerade exclusiven Zugriff etc.). Ich würde einfach hingehen und die Exceptions beim Zugriff auf ein File/directory fangen und dann eben mit dem nächsten File/Directory fortsetzen.

          Comment


          • #6
            Originally posted by Ralf Jansen View Post
            Wenn du nur eine Version von GetFiles schreiben willst die nicht abbricht gehst du glaube ich mit einer Rechte Prüfung zu weit bzw. am Problem vorbei. Es gibt ja auch andere Gründe warum ein File/Directory nicht lesbar ist (defekt, liegt auf einem gerade nicht verfügbaren Network-share, ein anderes Programm hat gerade exclusiven Zugriff etc.). Ich würde einfach hingehen und die Exceptions beim Zugriff auf ein File/directory fangen und dann eben mit dem nächsten File/Directory fortsetzen.
            Wenn man das über Exceptions löst dann werden nachfolgende Order die nach dem Exception werfenden Ordner übersprungen.

            Comment


            • #7
              Wenn man das über Exceptions löst dann werden nachfolgende Order die nach dem Exception werfenden Ordner übersprungen.
              Nein. Exception fangen und dann weitermachen. Wen das nicht geht hast du es nur falsch umgesetzt (Also die Exception an der falschen Stelle gefangen so das du aus deinem rekursiven Algorithmus rausfällst).

              Comment

              Working...
              X