[SOLUCIONADO] Una pregunta sobre IO.Directory.GetFiles

Iniciado por Eleкtro, 18 Enero 2013, 10:10 AM

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

_katze_

pero al hacerlo con mi clase no necesits permisos de administrador ni ninguna magia negra. como con el frame :-*

Eleкtro

#11
A pesar de la bonita Class de _katze_ (por cierto, gracias), y después de mucho buscar la manera más óptima ...al final me quedo con esta función:

Código (vbnet) [Seleccionar]
Private Function Get_Files(ByVal Path As String, ParamArray exts() As String) As List(Of IO.FileInfo)
   Return New IO.DirectoryInfo(Path).GetFiles.Where(Function(o) exts.Contains(o.Extension)).ToList
End Function


Código (vbnet) [Seleccionar]
For Each file In Get_Files("C:\Windows", {".dll", ".ini"}) : MsgBox(file.Name) : Next

Más sencillo y eficaz creo que sería imposible!

Lo malo es que no se me ocurre como hacer para que la función me permita buscar de manera recursiva,
me gustaría poder implementar la recursividad en esa función, preservando su maravillosa sencillez, elegancia y eficacia, es decir...que no quiero llenar la función de Fors para hacer largos recorridos en los subdirectorios estropeando la performance de la función.

¿Alguien tiene idea de que modificaciones necesita la función para hacerla recursiva?








Eleкtro

#12
Ahora sí, mejor imposible!, aquí tienen la forma más eficiente:

Código (vbnet) [Seleccionar]
   Private Function Get_Files(ByVal rootDirectory As String, ByVal recursive As Boolean, ParamArray exts() As String) As List(Of IO.FileInfo)
       Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly)
       Return IO.Directory.GetFiles(rootDirectory, "*.*", searchOpt).Where(Function(o) exts.Contains(IO.Path.GetExtension(o))).Select(Function(p) New IO.FileInfo(p)).ToList
   End Function


Ejemplo de uso:

Código (vbnet) [Seleccionar]
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       For Each file In Get_Files("C:\Windows", True, {".dll", "DLL"}) : MsgBox(file.Name) : Next
   End Sub


EDITO: Lo único imperfecto es que no es Ignore case, así que habría que usar la función así:
Código (vbnet) [Seleccionar]
For Each file In Get_Files("C:\Windows", True, {".dll", "DLL"}) : MsgBox(file.Name) : Next

;D