[.net3.5] extension methods: sur les classes system.io

Description

Les extensions de méthodes, en voici une nouveauté introduite avec VB2008.
Elles permettent d'étendre les méthodes d'objets existant.

J'ai donc mis en pratique cette nouveauté sur différentes classe de l'espace de noms System.IO
Voici les méthodes ajoutées sur les différentes classes:

System.IO.FileInfo:
-GetLowAndHighOrderSize (Obtient la partie haute 32 bits et basse 32 bits de la taille du fichier )
-GetFileType (Indique le type du fichier)
-GetBinaryType (Indique le type d'executable du fichier)
-IsCompressed (Indique si le fichier est compresser (fonctionnalitée de compression interne du noyau NT))
-GetAssociatedIcon (Récupère un bitmap de l'icone du fichier)
System.IO.File:
-Compress (Compresse un fichier en exploitant la fonctionnalitée de compression interne du noyau NT)
-Uncompress (Décompresse un fichier compressé avec la fonctionnalitée de compression interne du noyau NT)
System.IO.DirectoryInfo:
-IsEmpty (Indique si le répertoire est vide)
-Length (Obtient la taille en octets du répertoire)
System.IO.Directory:
-CreateOnDesktop (Création d'un répertoire sur le bureau de l'utilisateur)
System.IO.DriveInfo:
-CompressionIsSupported (Indique si la compression NTFS est supporté sur le lecteur)

Source / Exemple :


#Region "File Extension methods"

    ''' <summary>
    ''' Obtient la taille du fichier.
    ''' </summary>
    ''' <param name="LowOrder">Recoit la partie basse 32 bits de la taille du fichier.</param>
    ''' <param name="HighOrder">Recoit la partie haute 32 bits de la taille du fichier.</param>
    ''' <returns><b>True</b> si la fonction à réussi;<b>False</b> si échec.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetLowAndHighOrderSize(ByVal fi As System.IO.FileInfo, _
                                      ByRef LowOrder As UInteger, ByRef HighOrder As UInteger) As Boolean

        Try

            'Ouvre un handle sur le fichier.
            Dim hFile As IntPtr = CreateFile(fi.FullName, GENERIC_READ, IO.FileShare.Read, IntPtr.Zero, _
                               IO.FileMode.Open, OPEN_EXISTING, IntPtr.Zero)

            If hFile <> IntPtr.Zero Then

                'Récupèration des valeurs hautes et basses.
                Dim iHigh As Integer = 0
                Dim iLow As Integer = GetFileSize(hFile, iHigh)

                LowOrder = iLow
                HighOrder = iHigh

                'Ferme le handle.
                CloseHandle(hFile)

                Return True

            Else

                LowOrder = 0
                HighOrder = 0

                Return False
            End If
        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Indique le type du fichier.
    ''' </summary>
    ''' <returns>Retourne le type du fichier <see cref="FILE_TYPE"></see>.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetFileType(ByVal fi As System.IO.FileInfo) As FILE_TYPE

        Try

            'Ouvre un handle sur le fichier.
            Dim hFile As IntPtr = CreateFile(fi.FullName, GENERIC_READ, IO.FileShare.Read, IntPtr.Zero, _
                               IO.FileMode.Open, OPEN_EXISTING, IntPtr.Zero)

            If hFile <> IntPtr.Zero Then

                'Interrogation du type.
                Dim iType As Integer = GetFileType(hFile)
                Dim ft As FILE_TYPE = CType(iType, FILE_TYPE)

                'Ferme le handle
                CloseHandle(hFile)

                Return ft

            Else
                Return FILE_TYPE.FILE_TYPE_UNKNOWN
            End If
        Catch ex As Exception
            Return FILE_TYPE.FILE_TYPE_UNKNOWN
        End Try

    End Function

    ''' <summary>
    ''' Indique le type d'executable du fichier.
    ''' </summary>
    ''' <returns>Le type de l'executable <see cref="EXE_BINARY_TYPE"></see>.</returns>
    ''' <remarks>Valable uniquement sur les fichiers executables.</remarks>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetBinaryType(ByVal fi As System.IO.FileInfo) As EXE_BINARY_TYPE

        Try
            If fi.Exists AndAlso fi.Extension = ".exe" Then

                Dim iBin As Integer = 0
                Dim bRet As Boolean = GetBinaryType(fi.FullName, iBin)

                Dim ext As EXE_BINARY_TYPE = CType(iBin, EXE_BINARY_TYPE)

                Return ext

            Else
                Return EXE_BINARY_TYPE.SCS_NOT_BINARY
            End If

        Catch ex As Exception
            Return EXE_BINARY_TYPE.SCS_NOT_BINARY
        End Try

    End Function

    ''' <summary>
    ''' Indique si le fichier est compresser (fonctionnalitée de compression interne du noyau NT).
    ''' </summary>
    ''' <returns><b>True</b> si fichier compressé;<b>False</b> si non compressé.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsCompressed(ByVal fi As System.IO.FileInfo) As Boolean

        Try

            'Ouvre un handle sur le fichier.
            Dim hFile As IntPtr = CreateFile(fi.FullName, GENERIC_READ, IO.FileShare.Read, IntPtr.Zero, _
                               IO.FileMode.Open, OPEN_EXISTING, IntPtr.Zero)

            If hFile <> IntPtr.Zero Then

                Dim iMethod As Short = -1
                Dim iBytesReturned As Integer = 0

                'Récupère la valeur de compression sur le fichier.
                GetIoCompression(hFile, FSCTL_GET_COMPRESSION, 0, 0, iMethod, Marshal.SizeOf(GetType(Short)), _
                                 iBytesReturned, IntPtr.Zero)

                'Ferme le handle.
                CloseHandle(hFile)

                If iMethod <> 0 Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Compresse un fichier en exploitant la fonctionnalitée de compression interne du noyau NT.
    ''' </summary>
    ''' <param name="filePath">Fichier à compresser.</param>
    ''' <returns><b>True</b> la compression s'est bien déroulée; <b>False</b> dans le cas contraire.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Compress(ByVal f As System.IO.File, ByVal filePath As String) As Boolean

        Try

            'Ouvre un handle sur le fichier.
            Dim hFile As IntPtr = CreateFile("\\.\" & filePath, GENERIC_READ Or GENERIC_WRITE, IO.FileShare.None, IntPtr.Zero, _
                               IO.FileMode.Open, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero)

            If hFile <> IntPtr.Zero Then

                Dim iBytesReturned As Integer = 0
                Dim shtMethod As Short = CType(COMPRESSION_METHOD.LZNT1, Short)

                'Compresse le fichier.
                Dim bRet As Boolean = SetIoCompression(hFile, FSCTL_SET_COMPRESSION, shtMethod, Marshal.SizeOf(GetType(Short)), _
                                                       IntPtr.Zero, 0, iBytesReturned, IntPtr.Zero)
                'Ferme le handle.
                CloseHandle(hFile)

                Return bRet

            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Décompresse un fichier compressé avec la fonctionnalitée de compression interne du noyau NT.
    ''' </summary>
    ''' <param name="filePath">Fichier à décompresser.</param>
    ''' <returns><b>True</b> la décompression s'est bien déroulée; <b>False</b> dans le cas contraire.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Uncompress(ByVal f As System.IO.File, ByVal filePath As String) As Boolean

        Try

            'Ouvre un handle sur le fichier.
            Dim hFile As IntPtr = CreateFile("\\.\" & filePath, GENERIC_READ Or GENERIC_WRITE, IO.FileShare.None, IntPtr.Zero, _
                               IO.FileMode.Open, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero)

            If hFile <> IntPtr.Zero Then

                Dim iBytesReturned As Integer = 0
                Dim shtMethod As Short = CType(COMPRESSION_METHOD.NONE, Short)

                'Décompresse le fichier.
                Dim bRet As Boolean = SetIoCompression(hFile, FSCTL_SET_COMPRESSION, shtMethod, Marshal.SizeOf(GetType(Short)), _
                                                       IntPtr.Zero, 0, iBytesReturned, IntPtr.Zero)
                'Ferme le handle.
                CloseHandle(hFile)

                Return bRet

            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Récupère un bitmap de l'icone du fichier.
    ''' </summary>
    ''' <returns>Un <see cref="Bitmap"></see> de l'icone obtenu.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetAssociatedIcon(ByVal fi As System.IO.FileInfo) As Bitmap

        Try

            If fi.Exists Then

                'Récupère l'icone.
                Dim iconRet As System.Drawing.Icon = _
                    System.Drawing.Icon.ExtractAssociatedIcon(fi.FullName)

                'Retourne l'icone sous représentation Bitmap.
                Return iconRet.ToBitmap()

            Else
                Return Nothing
            End If

        Catch ex As Exception
            Return Nothing
        End Try

    End Function

#End Region

#Region "Directory Extension methods"

    ''' <summary>
    ''' Indique si le répertoire est vide.
    ''' </summary>
    ''' <returns><b>True</b> si vide;<b>False</b> dans le cas contraire.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsEmpty(ByVal di As System.IO.DirectoryInfo) As Boolean

        Try

            If di.Exists Then
                Return PathIsDirectoryEmpty(di.FullName)
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Création d'un répertoire sur le bureau de l'utilisateur.
    ''' </summary>
    ''' <param name="DirectoryName">Nom du répertoire à créer.</param>
    ''' <returns><b>True</b> si créer; <b>False</b> dans le cas contraire.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function CreateOnDesktop(ByVal di As System.IO.Directory, ByVal DirectoryName As String) As Boolean

        Try

            System.IO.Directory.CreateDirectory(System.IO.Path.Combine( _
                                                Environment.GetFolderPath(Environment.SpecialFolder.Desktop), DirectoryName))
            Return True

        Catch ex As Exception
            Return False
        End Try

    End Function

    ''' <summary>
    ''' Obtient la taille en octets du répertoire.
    ''' </summary>
    ''' <param name="extension">Filtrer les extensions.</param>
    ''' <param name="SearchOption">Options sur visibilité du contenu du répertoire.</param>
    ''' <returns>La taille en octets.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Length(ByVal di As System.IO.DirectoryInfo, Optional ByVal extension As String = "*.*", _
                           Optional ByVal SearchOption As System.IO.SearchOption = IO.SearchOption.AllDirectories) As Long

        Try

            If di.Exists Then

                Dim lLength As Long = 0
                'Récupération de la liste des fichiers du répertoires en appliquant les filtres.
                Dim files As String() = System.IO.Directory.GetFiles(di.FullName, extension, SearchOption)

                'Et ont fait les comptes...
                If files IsNot Nothing AndAlso files.Count > 0 Then

                    For i As Integer = 0 To files.Count - 1
                        lLength += New System.IO.FileInfo(files(i)).Length
                    Next

                End If

                Return lLength

            Else
                Return 0
            End If

        Catch ex As Exception
            Return 0
        End Try

    End Function

#End Region

#Region "Drive Extension methods"

    ''' <summary>
    ''' Indique si la compression NTFS est supporté sur le lecteur.
    ''' </summary>
    ''' <returns><b>True</b> si la compression NTFS est supporté; <b>False</b> dans le cas contraire.</returns>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function CompressionIsSupported(ByVal fi As System.IO.DriveInfo) As Boolean

        Try

            Dim szVolBuff As New StringBuilder
            Dim szFSBuff As New StringBuilder
            Dim flags As Integer = 0

            'Récupération d'informations sur le lecteur.
            GetVolumeInformation(fi.RootDirectory.FullName, szVolBuff, 128, _
                                 Nothing, Nothing, flags, szFSBuff, 128)

            'Masque qui va permettre de définir si la compression sur le lecteur est supporté.
            If flags And FS_FILE_COMPRESSION Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

#End Region

Conclusion :


Exemple d'utilisation (Ajouter le module à votre projet)

Dim fi as New System.IO.FileInfo("C:\MonFichier.txt")
fi.GetLowAndHighOrderSize(lowOrder, highOrder)
fi.GetFileType()
fi.GetBinaryType()
fi.IsCompressed()
fi.GetAssociatedIcon()

dim f as System.IO.File
f.Compress("C:\MonFichier.txt")
f.Unompress("C:\MonFichier.txt")

dim di as New System.IO.DirectoryInfo("C:\MonDossier")
di.IsEmpty()
di.Length()

dim d as System.IO.Directory
d.CreateOnDesktop("DossierACreer")

dim di as New System.IO.DriveInfo
di.CompressionIsSupported()

----------------------------------------
Amusez-vous bien, il y a de nombreuses méthodes à ajouter encore :)
++

Codes Sources

A voir également

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.