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 :)
++
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.