Résoudre le nom d'un fichier ou d'un répertoire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 391 fois - Téléchargée 32 fois


Contenu du snippet

Ce code permet de résoudre le nom d'un fichier ou d'un répertoire, même s"il n'existe pas, du type "c:\abcdef\..\ghijkl\" (="C:\ghijkm\"), indépendamment du système de fichier (possibilité de changer le séparateurs de répertoires, caractères invalides). Ca peut être utile si on travaille sur un système de fichiers personnel (archives) ou un système d'autorisations.

Source / Exemple :


Imports System 'Exceptions
Imports System.Text 'StringBuilder
Imports System.Collections.Specialized 'StringCollection

    Public Shared Function FixDir(ByVal path As String) As String
        Return FixDir(path, New Char() {System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar}, System.IO.Path.InvalidPathChars)
    End Function
    Public Shared Function FixDir(ByVal path As String, ByVal directorySeparators As Char(), ByVal invalidChars As Char()) As String
        If path Is Nothing Then Return Nothing
        Dim tempSB As New StringBuilder(path.Length)        'chemin final
        Dim tokens As String()                              'éléments du chemin initial
        Dim finalTokens As New StringCollection 'éléments du chemin final
        Dim i As Integer
        'Si le(s) séparateur(s) de répertoire ne sont pas spécifié(s), utiliser les séparateurs par défaut. 
        If directorySeparators Is Nothing OrElse directorySeparators.Length = 0 Then
            directorySeparators = New Char() {System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar}
        End If
        tokens = path.Split(directorySeparators)
        'Recherche les caractères invalides
        If Not invalidChars Is Nothing AndAlso Not invalidChars.Length = 0 Then
            Dim invalidCharIndex As Integer = path.IndexOfAny(invalidChars)
            If invalidCharIndex <> -1 Then
                Throw New InvalidOperationException([String].Format("Le chemin d'accès ""{0}"" contient un ou plusieurs caractères invalides: ""{1}""", path, path.Chars(invalidCharIndex).ToString))
            End If
        End If
        'Résolution des éléments du chemin final
        For i = 0 To tokens.Length - 1
            Select Case tokens(i)
                Case ""
                    'fait référence au même répertoire (path\\ = path)
                    'ne recopie pas l'élément
                Case "."
                    'fait référence au même répertoire (path\. = path)
                    'ne recopie pas l'élément
                Case ".."
                    'fait référence au répertoire parent (path\abcd\.. = path)
                    'ne recopie pas l'élément et enlève le dernier
                    If finalTokens.Count = 0 Then
                        Throw New ArgumentException([String].Format("Le chemin d'accès ""{0}"" est invalide", path))
                    Else
                        finalTokens.RemoveAt(finalTokens.Count - 1)
                    End If
                Case Else
                    finalTokens.Add(tokens(i))
            End Select
        Next
        Dim tempSep As Char = directorySeparators(0) 'séparateur de répertoire utilisé
        'Assemble le chemin d'accès, suite de répertoires séparés par des '\' sauf pour le dernier
        For i = 0 To finalTokens.Count - 1
            tempSB.Append(finalTokens(i))
            If (i + 1) <> finalTokens.Count Then
                tempSB.Append(tempSep)
            End If
        Next
        Return tempSB.ToString()
    End Function

Conclusion :


'Tests
Try
Debug.WriteLine(FixDir("c:\temp\Abcd\.\..\Efgh\.\\.\./..\Efgh\."))
Debug.WriteLine(FixDir("c:\temp\Abcd\\"))
Debug.WriteLine(FixDir("c:\temp\Abcd\"))
Debug.WriteLine(FixDir("c:\temp\Abcd"))
Debug.WriteLine(FixDir("c:\temp\Abcd\|efgh|\"))
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
'Donne:
c:\temp\Efgh
c:\temp\Abcd
c:\temp\Abcd
c:\temp\Abcd
Le chemin d'accès "c:\temp\Abcd\|efgh|\" contient un ou plusieurs caractères invalides: "|"

Me.WaitForComments()

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
lundi 1 décembre 2003
Statut
Membre
Dernière intervention
24 mai 2007

en ce qui me concerne
je cherchais un ex de code utilisant StringCollection
ca m a ete tres utilie
Messages postés
2
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
8 janvier 2004

ouais ben moi non plus g rien compris a ton truc !!
Moi je cherche un moyen de trouver le chemin d'un fichier juste avec le nom de ce fichier !!
Si tu sais ! fais moi signe please !
Messages postés
63
Date d'inscription
dimanche 15 octobre 2000
Statut
Membre
Dernière intervention
21 février 2008

moi j'ai toujours pas pigé
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

(Edit du précedent)
Par exemple si on doit autoriser l'accès qu'a certain fichiers sur un autre ordinateur (On peut pas passer par Path donc) de pouvoir se fier à String.StartsWith().

Si par exemple seul le répertoire "C:Mes documents" est accessible, on peut contourner la protection:

"C:\Mes Documents\..\Windows\system32".StartsWith("C:\Mes documents") = True

et accéder au répertoire de Windows dont l'accès n'est pas autorisé. Avec FixDir le chemin "C:\Mes Documents\..\Windows\system32" est résolu en "C:\Windows\system32" et l'accès est refusé. ("C:\Windows\system32".StartsWith("C:\Mes documents") = False)

C'est sûr que ca peut être utile que dans certaines situations précises.
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

Par exemple si on doit autoriser l'accès qu'a certain fichiers sur un autre ordinateur (On peut pas passer par Path donc) de pouvoir se fier à String.StartsWith().

Si par exemple seul le répertoire "C:Mes documents" est accessible, on peut contourner la protection:

"C:Mes Documents..Windowssystem32".StartsWith("C:Mes documents"") = True

et accéder au répertoire de Windows dont l'accès n'est pas autorisé. Avec FixDir le chemin "C:Mes Documents..Windowssystem32" est résolu en "C:Windowssystem32" et l'accès est refusé. ("C:Windowssystem32".StartsWith("C:Mes documents"") = False)

C'est sûr que ca peut être utile que dans certaines situations précises.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.