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()
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.