[SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?

Iniciado por Eleкtro, 14 Enero 2013, 01:45 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

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.








Novlucker

¿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 :-\
Código (csharp) [Seleccionar]
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Program Files (x86)");
long size = directoryInfo.GetFiles("*", SearchOption.AllDirectories).Sum(f => f.Length);


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Novlucker

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#

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

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Eleкtro

#4
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:

Código (vbnet) [Seleccionar]
   ' 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








Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein