Quelle est la meilleure façon de calculer la taille d'un répertoire dans VB .NET?
J'ai besoin de calculer la taille de répertoire dans VB .Net
Je sais que les 2 méthodes suivantes
Méthode 1: à partir de MSDN http://msdn.microsoft.com/en-us/library/system.io.directory.aspx
' L'exemple suivant calcule la taille d'un répertoire
"et ses sous-répertoires, et affiche la taille totale
'en octets.
Imports System
Imports System.IO
Public Class ShowDirSize
Public Shared Function DirSize(ByVal d As DirectoryInfo) As Long
Dim Size As Long = 0
' Add file sizes.
Dim fis As FileInfo() = d.GetFiles()
Dim fi As FileInfo
For Each fi In fis
Size += fi.Length
Next fi
' Add subdirectory sizes.
Dim dis As DirectoryInfo() = d.GetDirectories()
Dim di As DirectoryInfo
For Each di In dis
Size += DirSize(di)
Next di
Return Size
End Function 'DirSize
Public Shared Sub Main(ByVal args() As String)
If args.Length <> 1 Then
Console.WriteLine("You must provide a directory argument at the command line.")
Else
Dim d As New DirectoryInfo(args(0))
Dim dsize As Long = DirSize(d)
Console.WriteLine("The size of {0} and its subdirectories is {1} bytes.", d, dsize)
End If
End Sub 'Main
End Class 'ShowDirSize
Méthode 2: à partir de Quelle est la meilleure façon de calculer la taille d'un répertoire .NET?
Dim size As Int64 = (From strFile In My.Computer.FileSystem.GetFiles(strFolder, _
FileIO.SearchOption.SearchAllSubDirectories) _
Select New System.IO.FileInfo(strFile).Length).Sum()
Ces deux méthodes fonctionnent bien. Cependant, ils prennent beaucoup de temps pour calculer la taille de répertoire si il y a beaucoup de sous-dossiers. e.g, j'ai un répertoire avec 150 000 sous-dossiers. Les méthodes ci-dessus a pris environ 1 heure 30 minutes pour calculer la taille de l'annuaire. Cependant, si je vérifie la taille de windows, il prend moins d'une minute.
Veuillez vous proposer la meilleure et la plus rapide façon de calculer la taille de l'annuaire.
OriginalL'auteur Virendra | 2010-07-08
Vous devez vous connecter pour publier un commentaire.
Même si cette réponse est de parler de Python, le concept s'applique ici aussi.
L'Explorateur Windows utilise le système des appels d'API
FindFirstFile
etFindNextFile
de manière récursive pour tirer des informations de fichier, et peut alors accéder au fichier de tailles très rapidement à travers les données qui sont transmises via unstruct
,WIN32_FIND_DATA
: http://msdn.microsoft.com/en-us/library/aa365740(v=VS.85).aspx.Ma suggestion serait de mettre en œuvre ces appels de l'API à l'aide de P/Invoke, et je crois que vous ferez l'expérience des gains de performance significatifs.
OriginalL'auteur rakuo15
De faire le travail en parallèle doit le rendre plus rapide, au moins sur multi-core machines. Essayez ce code C#. Vous devrez traduire pour VB.NET.
OriginalL'auteur Jamie
C'est un court et doux extrait de code que le travail sera fait. Vous avez juste besoin de réinitialiser le compteur avant d'appeler la fonction
Les ':' opérateur permet à prétendre qu'il y a une autre ligne sans en appuyant sur entrée, il ajoute la taille de chaque fichier, puis récursivement ajoute les fichiers à partir de chaque sous-répertoire... mais ils ont oublié d'ajouter la taille de la sous-répertoires à la taille totale 🙂
OriginalL'auteur jfjsdflkj
Ici ce aussi court que je peux l'obtenir.
Il affiche la taille de l'sélectionnée dans une boîte de message.
Vous allez avoir besoin d'un
FolderBrowserDialog
dans le formulaire pour que cela fonctionne.OriginalL'auteur Gamer_sa22
VB Code sur la base de Jamie réponse:
Interlocked
pas défini.elle est définie dans le Système.Le filetage. Vérifier la mise à jour de réponse.
OriginalL'auteur mathiasfk
Essayez ceci pour obtenir la taille totale en GO
OriginalL'auteur BR1COP