Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Novlucker

#221
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

#222
¿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
#223
Me he asustado un poco con lo último de los dibujos con GDI+ :xD Por lo que entiendo, el problema sería que el form esta recibiendo más datos de los que puede procesar/dibujar no? Tal vez lo he entendido mal, pero en este caso, por más que se ejecute en otro hilo seguirá existiendo el cuello de botella :-\

Saludos
#224
Los get y set son reservados. Y si estabas mirando el código que aparece en el link que he dejado anteriormente, lo único que se da como ejemplo es una propiedad auto-implementada y virtual, que luego es sobreescrita por la clase derivada, no me queda claro cual sería la duda :-\

Saludos
#225
Por desgracia, las aplicaciones "Modern UI Syle" (antes Metro Style) están limitadas a Windows 8 y RT (tablets).

En lo que respecta a su distribución, para Windows 8 puedes generar instaladores para distribuir por fuera del market, para Win RT solo es posible hacerlo por medio de este.

Saludos
#226
Bueno, lo siguiente son sugerencias, críticas o comentarios sobre algunos de los snippets que has puesto en el post, así como algo más genérico sobre como estructuras tus métodos o funciones, y el código en general.

  • Es aconsejable declarar el tipo de retorno de las funciones en su declaración. Para alguien que no tiene claro el objetivo de una función es mucho más legible hacerlo de este modo, de lo contrario hay que revisar el código de la función en busca de los Return para darse cuenta de que la función retorna un booleano por ejemplo.

Código (vbnet) [Seleccionar]
Private Function Funcion() As Boolean

  • Función Attrib. Ya que estás creando una función que te abstrae de verificar la existencia de un archivo y asignar atributos, tal vez lo mejor sería que la función reciba una lista de atributos en lugar de un atributo global. Es decir, en este caso al utilizar tu función es necesario pasar la suma de los atributos para que asigne varios (como en la función original), pero por que no abstraerse un poco más y olvidarse de la suma?

Código (vbnet) [Seleccionar]
    Private Function Attrib(ByVal File As String, ByVal Attributes As List(Of System.IO.FileAttributes)) As Boolean
        If IO.File.Exists(File) Then
            Try
                FileSystem.SetAttr(File, Attributes.Select(Function(a) DirectCast(a, Integer)).Sum())
                Return True ' File was modified OK
            Catch ex As Exception
                ' MsgBox(ex.Message)
                Return False ' File can't be modified maybe because User Permissions
            End Try
        Else
            Return Nothing ' File doesn't exist
        End If
    End Function


  • "Controlar el mismo evento para varios controles". No es aconsejable tener un solo método con condiciones para cada control por separado, lo recomendado es tener un método por evento. Si necesitas realizar algo en específico para un control en especial, entonces asigna un método diferente al control.
  • Función ConvertToDiscSize. Si debes de pasar un string a una función, para luego tomar una decisión según se trate de un string u otro, debes de plantearte declarar un enumerador (esto mismo es aplicable a otras de tus funciones). Por otra parte, tampoco es recomendable tener todos los valores hardcodeados en un método, además de que estás repitiendo mucho código. A continuación una variante de la función reestructrada;

Código (vbnet) [Seleccionar]
#Region " Convert To Disc Size function"

Private Function ConvertToDiscSize(ByVal fileSize As Double, ByVal fileKindSize As MagnitudeType, ByVal to_DiscKindCapacity As DiscType) As Double
    Dim size As Double = GetSize(to_DiscKindCapacity)
    If (size < 0) Then Throw New ArgumentException("Tamaño de disco no localizado")
    Return fileSize * DirectCast(fileKindSize, Integer) / size
End Function

Enum MagnitudeType
    Bytes = 1
    KB = 1024
    MB = 1048576
    GB = 1073741824
End Enum

Enum DiscType
    CD
    CD800
    CD900
    DVD
    DVD_DL
    BR
    BR_DL
    BR_3L
    BR_4L
    BR_MD
    BR_MD_DL
End Enum

Private Function GetSize(ByVal discType As DiscType) As Double
    Select Case discType
        Case DiscType.CD
            Return 737280000      ' CD Standard
        Case DiscType.CD800
            Return 829440393.216 ' CD 800 MB
        Case DiscType.CD900
            Return 912383803.392 ' CD 900 MB
        Case DiscType.DVD
            Return 4700000000 ' DVD Standard (DVD5
        Case DiscType.DVD_DL
            Return 8500000000 ' DVD Double Layer (DVD9)
        Case DiscType.BR
            Return 25025314816 ' BluRay Standard
        Case DiscType.BR_DL
            Return 50050629632 ' BluRay Double Layer
        Case DiscType.BR_3L
            Return 100103356416 ' BluRay x3 Layers
        Case DiscType.BR_4L
            Return 128001769472 ' BluRay x4 Layers
        Case DiscType.BR_MD
            Return 7791181824 ' BluRay MiniDisc Standard
        Case DiscType.BR_MD_DL
            Return 15582363648 ' BluRay MiniDisc Double Layer
        Case Else
            Return -1 ' Por si se declara un nuevo valor en el enumerador sin especificar tamaño
    End Select
End Function

#End Region


Creo que por el momento es todo lo que se me ocurre, en otro momento vuelvo a mirar :P

Saludos
#227
Otra alternativa es utilizar generics, pero tampoco aplica para el caso, si vas a utilizar generics no deberías de estar verificando el tipo luego.

Cita de: EleKtro H@cker en 13 Enero 2013, 18:20 PM
Pero digo yo que no seré el primero en tener este problemilla xD... ¿Como lo solucionarías tú? :-[

Con sobrecargas, tendría dos métodos :P

Saludos
#228
Todos los tipos de objetos deberían de implementar la misma interfaz o heredar de la misma base (nada de lo que pones como ejemplo), de lo contrario, para eso se utilizan las sobrecargas :P

Podrías pasar un object, pero no es para nada recomendable, donde vea que comienzas a hacer eso te baneo :xD, en un rato me paso por tu post de snippets para darte unas sugerencias en cuanto a estructura de código :)

Saludos


#229
Sí entiendes eso, entonces mejor leer lo mismo en español :P

http://msdn.microsoft.com/es-es/library/9fkccyh4(v=vs.80).aspx
#230
Cita de: seba123neo en 11 Enero 2013, 23:05 PM
no entiendo porque este post tiene chincheta  :rolleyes:

Ups  :-X
Cita de: r7pyrred en 11 Enero 2013, 23:27 PM
La herencia es una caracterísica de lenguaje POO que es capaz dereutilizar
otra clase por ejemplo de una superclase y tener la misma signature creo que me expliqué bien,por cierto gracias por responder

Bien, sí tú en una clase tienes un método X con cierto comportamiento, y en una clase derivada quieres redefinir/reescribir este método, el mismo debe de estar declarado como virtual en la base (abstracto es otra opción, pero tiene otro comportamiento).

Supongamos que tienes una clase Vehículo con un método mover que simula el movimiento en un casillero. Por otra parte tienes una clase derivada de nombre Ferrari, sí quieres que este último se mueva 5 casilleros, en la clase Vehículo el método mover debe de estar definido como virtual, para luego en Ferrari sobreescribirlo con override :)

Espero se haya entendido.

Saludos