Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 14 Enero 2013, 01:45 am



Título: [SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: Eleкtro en 14 Enero 2013, 01:45 am
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:

Código:
        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.


Título: Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: Novlucker en 14 Enero 2013, 02:53 am
¿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
  1. DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Program Files (x86)");
  2. long size = directoryInfo.GetFiles("*", SearchOption.AllDirectories).Sum(f => f.Length);

Saludos


Título: Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: 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)


Título: Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: Novlucker en 14 Enero 2013, 03:08 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
 


Título: Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: Eleкtro en 14 Enero 2013, 04:12 am
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
  1.    ' MsgBox(Get_Directory_Size(New IO.DirectoryInfo("C:\_"), True))
  2.  
  3.    Private Function Get_Directory_Size(Dir_Info As IO.DirectoryInfo, Include_Subfolders As Boolean) As Long
  4.        Dim Dir_Total_Size As Long = Dir_Info.EnumerateFiles().Sum(Function(file) file.Length)
  5.        If Include_Subfolders Then Dir_Total_Size += Dir_Info.EnumerateDirectories().Sum(Function(dir) Get_Directory_Size(dir, True))
  6.        Return Dir_Total_Size
  7.    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


Título: Re: [SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?
Publicado por: Novlucker en 14 Enero 2013, 04:47 am
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