Necesito obtener el tamaño de una carpeta.
Como me gusta hacer las cosas perfectas (A pesar de lo poco que sé todavía de .NET) pues quiero saber si conocen alguna forma más simple (es decir, más rápida) que usar un directory.GetFiles...
Me he fijado en que en el explorer cuando clickamos en las propiedades de una carpeta para ver el tamaño, pues parece que vaya contando los archivos y se vaya incrementando de tamaño,
PERO!!... por otro lado, si hacemos lo mismo sobre un disco duro u otro dispositivo, el tamaño se muestra en un segundo,
y además, con el Scripting.FileSystemObject es tán simple como esto:
Dim folder As Scripting.FolderClass = fs.GetFolder(Environment.GetFolderPath(Environment.SpecialFolder.Personal))
MessageBox.Show(folder.Size)
(Pero no forma parte de .NET)
Así que tengo muchas dudas de si usar el método GetFiles es la única manera y la más rápida...
PD: He buscado mucho en Google y solo veo Getfiles por todas partes.
Gracias por leer.
¿Cuando te refieres a "rápida" lo dices por performance?
Hasta donde tengo entendido el tamaño no es una de las propiedades de una carpeta, por eso no aparece en el explorer, y por esto el DirectoryInfo no contiene la información, por lo que la alternativa es sumar el tamaño de todos los archivos de manera recursiva o no.
El tema es que hay que iterar los directorios y archivos porque si bien lo siguiente funciona, algunas veces se obtiene un UnauthorizedAccessException por los subdirectorios :-\
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Program Files (x86)");
long size = directoryInfo.GetFiles("*", SearchOption.AllDirectories).Sum(f => f.Length);
Saludos
otra forma que se incluyo en la 4.0 del framework es esta forma con LINQ.
How to Calculate the Size of the Folder Using LINQ in C# (http://social.technet.microsoft.com/wiki/contents/articles/13096.how-to-calculate-the-size-of-the-folder-using-linq-in-c.aspx)
Cita de: seba123neo en 14 Enero 2013, 02:57 AM
otra forma que se incluyo en la 4.0 del framework es esta forma con LINQ.
How to Calculate the Size of the Folder Using LINQ in C# (http://social.technet.microsoft.com/wiki/contents/articles/13096.how-to-calculate-the-size-of-the-folder-using-linq-in-c.aspx)
Igual ese artículo habla de calcular el tamaño de los directorios con LINQ, pero de LINQ tiene solamente el
Sum que usé más arriba, así que no deja de ser un método recursivo :P
Saludos
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
Por "rápido" me refiero al performance, sí, a la que gaste menos recursos, menos tiempo, y la que no deba leer todos los archivos para saber el tamaño total (Si es que hubiera alguna que no lo hiciera, que parece que no).
Es una m**rda lo que comenta Novlucker porque ya lo he sufrido más de una vez, pero windows si que obtiene el tamaño de las carpetas que contienen archivos sin acceso, entonces alguna forma habrá, ¿No?
He reducido el code que me ha enseñado Seba, a esto:
' MsgBox(Get_Directory_Size(New IO.DirectoryInfo("C:\_"), True))
Private Function Get_Directory_Size(Dir_Info As IO.DirectoryInfo, Include_Subfolders As Boolean) As Long
Dim Dir_Total_Size As Long = Dir_Info.EnumerateFiles().Sum(Function(file) file.Length)
If Include_Subfolders Then Dir_Total_Size += Dir_Info.EnumerateDirectories().Sum(Function(dir) Get_Directory_Size(dir, True))
Return Dir_Total_Size
End Function
El tema es... que no sé usar los identificadores de acceso, ya lo intenté hace unos días...
¿Como hago esto?:
Private Function Get_Directory_Size(Directory As IO.DirectoryInfo, Include_Subfolders As Boolean) As Long
Dim Dir_Security As System.Security.AccessControl.DirectorySecurity = Directory.GetAccessControl()
If Dir_Security = "SIN ACCESO a alguno de los archivos" Then
Return Nothing
' bueno aquí tengo un lío de momento, quiero que salte el archivo y siga con el siguiente claro
Else
Dim Dir_Total_Size As Long = Directory.EnumerateFiles().Sum(Function(file) file.Length)
If Include_Subfolders Then Dir_Total_Size += Directory.EnumerateDirectories().Sum(Function(dir) Get_Directory_Size(dir, True))
Return Dir_Total_Size
End If
End Function
EDITO: Olviden lo que he dicho, con un TRY y listo :xD
Claro, el try/catch era la opción :P en el método que he puesto antes salta la excepción, y como lo estas haciendo para todos no puedes evitarlo y seguir, pero si lo puedes hacer con un try/catch específico en el método recursivo :P
Saludos