elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?  (Leído 5,104 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
[SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?
« 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.


« Última modificación: 14 Enero 2013, 04:31 am por EleKtro H@cker » En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
« Respuesta #1 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


En línea

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


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
« Respuesta #2 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#
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
« Respuesta #3 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#

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
 
En línea

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
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Cual es la forma más simple de obtener el tamaño de una carpeta?
« Respuesta #4 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
« Última modificación: 14 Enero 2013, 04:31 am por EleKtro H@cker » En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [SOLUCIONADO] Cual es la forma más simple de obtener el tamaño de una carpeta?
« Respuesta #5 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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tamaño de un Archivos o Carpeta
Programación Visual Basic
kakinets 5 2,601 Último mensaje 24 Septiembre 2005, 00:06 am
por kakinets
Imprimir texto de forma simple en VB .Net
Programación Visual Basic
gaston.falco 0 3,002 Último mensaje 21 Diciembre 2005, 22:45 pm
por gaston.falco
Limitar tamaño de carpeta
PHP
:ohk<any> 3 5,085 Último mensaje 9 Octubre 2009, 14:15 pm
por :ohk<any>
Cual es la mejor forma de cuidar la vida util de la bateria (Solucionado)
Hardware
Roy-Mustang 3 5,221 Último mensaje 31 Marzo 2011, 03:24 am
por Roy-Mustang
¿Cual es el método más simple de obtener 1 o -1 por azar?
Programación General
Tachikomaia 2 2,590 Último mensaje 24 Octubre 2023, 17:33 pm
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines