Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 26 Noviembre 2012, 10:15 AM

Título: (SOLUCIONADO) Se puede mejorar este FOR?
Publicado por: Eleкtro en 26 Noviembre 2012, 10:15 AM
Hola,

Mi app trabaja sobre MILES de archivos y quisiera saber si puedo mejorar este for para disminuir el tiempo de procesado:

Código (vbnet) [Seleccionar]

Dim accepted_extensions As String = ".264 .3gp .asf .asx .avi .avc .bsf .bdmv .divx .dv .evo .f4v .flv .hdmov .m1v .m2t .m2ts .m2v .m4v .mkv .mov .mp4 .mpeg .mpg .mpv4 .mts .ogm .ogv .qt .rmvb .swf .ts .vob .webm .wmv"

   Public Sub PlaylistsWorkWithFilesInDir(ByVal aDir As DirectoryInfo)
       consolebox.AppendText("Processing: " + aDir.ToString() + vbNewLine)
       consolebox.SelectionStart = consolebox.Text.Length
       consolebox.ScrollToCaret()
       Dim aFile As FileInfo
       For Each aFile In aDir.GetFiles()
           If accepted_extensions.ToLower.Contains(aFile.Extension.ToLower) Then
               Using writer As StreamWriter = New StreamWriter(aFile.DirectoryName.ToString() & "\" & aDir.Name & ".m3u", True, System.Text.Encoding.UTF8)
                   writer.WriteLine(aFile.FullName.ToString())
               End Using
           End If
       Next
   End Sub


Me pregunto si existirá algún método en el sistema para comprobar si el archivo es un archivo de video, algo así:
If IO.FileType(aFile) = "VideoFile" Then...
Título: Re: Se puede mejorar este FOR?
Publicado por: Novlucker en 26 Noviembre 2012, 13:12 PM
CitarRe: Se puede mejorar este FOR?

Algo que no me gusta y que no me parece que aporte a la performance de la aplicación, es que abres y cierras el archivo en cada iteración del for.

Cita de: EleKtro H@cker en 26 Noviembre 2012, 10:15 AM
Me pregunto si existirá algún método en el sistema para comprobar si el archivo es un archivo de video, algo así:
If IO.FileType(aFile) = "VideoFile" Then...

En el framework no la hay.

Saludos
Título: Re: Se puede mejorar este FOR?
Publicado por: Keyen Night en 26 Noviembre 2012, 16:22 PM
Usa las Apis de Windows FindFile y FindNextFile trabajan mucho más rápido cuando son miles de archivos. También te recomiendo hacer el trabajo desde un BackgroundWorker y usar el evento ProgressChanged para modificar cualquier aspecto visual como una barra de progreso o un Label si lo tienes.

Hay 2 maneras de saber si un archivo corresponde a un tipo, primero lo que haces verificar de una lista de extensiones, así lo hice en una aplicación y tengo está lista:

Código (vb.net) [Seleccionar]
           Public Video As String() = New String() {".ts", ".tts", ".m4v", ".mp4", ".mp4v", ".m2t", ".m2ts", ".mts", _
                              ".mov", ".avi", ".m1v", ".m2v", ".mod", ".mp2v", ".mpa", ".mpe", _
                              ".mpeg", ".mpg", ".mpv2", ".3g2", ".3gp2", ".3gp", ".3gpp", ".asf", _
                              ".wmv", ".flv", ".ogg", ".mkv", ".amc", ".mpeg1", ".mpeg2", ".mpeg4", _
                              ".mqv", ".qt", ".qtl", ".wmx", ".wmz"}


La otra es verificar las cabeceras de los archivos, pero eso es más incomodo XD
Título: Re: Se puede mejorar este FOR?
Publicado por: TomaSs en 26 Noviembre 2012, 20:44 PM
Posiblemente esto (http://www.daniweb.com/software-development/csharp/threads/153562/findfirstfile-in-c) te sirva, que tiene que ver con lo que te han dicho por aquí
;)
Título: Re: Se puede mejorar este FOR?
Publicado por: Eleкtro en 27 Noviembre 2012, 09:51 AM
Gracias a todos, especialmente por la larga explicación de Keyen, en cuanto tenga más organizado el form probaré lo dle findfiles.