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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Listar ficheros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Listar ficheros  (Leído 3,601 veces)
Tomas1982

Desconectado Desconectado

Mensajes: 48



Ver Perfil
Listar ficheros
« en: 22 Septiembre 2016, 23:40 pm »

Estoy tratando de listar los archivo de las unidades de disco encontradas pero me da error (Acceso denegado). Este es el código que estoy usando.  
Código
  1. For Each vUnidad As String In Directory.GetLogicalDrives()
  2. ListBox1.Items.Add(vUnidad)
  3. Next vUnidad
  4. 'Recorrer las unidades detectadas
  5. Dim Pdisco As String
  6. For i As Integer = 0 To Me.ListBox1.Items.Count - 1
  7. Pdisco = ListBox1.Items(i)
  8. 'Obtener los ficheros de las unidades
  9. filepaths = Directory.GetFiles(Pdisco, "*", SearchOption.AllDirectories)
  10. ListBox2.Items.Add(filepaths)
  11. Next
  12.  


« Última modificación: 22 Septiembre 2016, 23:43 pm por Tomas1982 » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Listar ficheros
« Respuesta #1 en: 23 Septiembre 2016, 13:32 pm »

Hay dos tipos de error el de la unidad que no está disponible como un DVD-ROM, una disquetera. Y otro es carpetas que no se pueden abrir por estar protegidas por el sistema.

Puedes usar Try/Catch para saltar el error o también, pero te van a regañar,  "On Error Resume Next"

Código
  1.  
  2.  
  3.        Task.Factory.StartNew(Sub()
  4.                                  Me.Invoke(Sub() Me.Cursor = Cursors.WaitCursor)
  5.  
  6.                                  For Each vUnidad As String In Directory.GetLogicalDrives()
  7.  
  8.  
  9.                                      ListBox1.Invoke(DirectCast(Sub() ListBox1.Items.Add(vUnidad), MethodInvoker))
  10.                                  Next vUnidad
  11.  
  12.                                  ''Recorrer las unidades detectadas
  13.                                  Dim Pdisco As String
  14.                                  For i As Integer = 0 To Me.ListBox1.Items.Count - 1
  15.                                      Pdisco = CStr(ListBox1.Items(i))
  16.  
  17.                                      'Obtener los ficheros de las unidades
  18.                                      Try
  19.                                          Dim DirInfo As New DirectoryInfo(Pdisco)
  20.                                          For Each Files As System.IO.FileInfo In DirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)
  21.                                              ListBox2.Invoke(DirectCast(Sub() ListBox2.Items.Add(Pdisco & Files.ToString), MethodInvoker))
  22.                                          Next
  23.                                      Catch ex As Exception
  24.                                      End Try
  25.                                  Next
  26.                              End Sub).ContinueWith(Sub()
  27.                                                        Me.Invoke(Sub() Me.Cursor = Cursors.Arrow)
  28.                                                    End Sub)
  29.  



De todos modos solo te va a listar los archivos inmediatos de un directorio pero no todos los archivos únicos de cada directorio y subdirectorios como carpetas y demás. Ni tampoco archivos ocultos. Por no decir que ese código no está bien implementado para ese objetivo.

Te lo he metido dentro de Task.Factory.StartNew(Sub() End Sub) para evitar que el programa se quede bloqueado mientras busca.

Ahora mismo no tengo nada para listar absolutamente todos los archivos y archivos ocultos. Tendría que mirármelo, porque nunca lo he hecho, por lo menos con VB.NET

chau

 

he estado mirándome el tema y esto sería creo más o menos lo que buscas pero..... como digo no lista todos los archivos, en este caso los de un directorio y sus subdirectorios.


Código
  1.        Dim strDirPath As String = "C:\"
  2.  
  3.        Dim astrSubDirectories As String() = Directory.GetDirectories(strDirPath)
  4.        Dim strSubDirectory As String
  5.        For Each strSubDirectory In astrSubDirectories
  6.            Dim direct As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
  7.  
  8.            Try
  9.                Dim astrFiles As String() = Directory.GetFiles(strDirPath & direct)
  10.                ListBox1.Items.Add(strSubDirectory)
  11.                For Each strFileName In astrFiles
  12.                    ListBox1.Items.Add(strFileName)
  13.                Next
  14.  
  15.            Catch exc As Exception
  16.  
  17.            End Try
  18.        Next
  19.  
  20.        Try
  21.            Dim DirInfo As New DirectoryInfo(strDirPath)
  22.            For Each Files As System.IO.FileInfo In DirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)
  23.                ListBox1.Items.Add(strDirPath & Files.ToString)
  24.            Next
  25.        Catch ex As Exception
  26.        End Try

El error de Acceso denegado, es porque hay carpetas protegidas por el sistema como Document and Settings que no deja que sean abiertas.




Código
  1.       Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
  2.        For Each [Drive] In allDrives
  3.            Try
  4.                Dim astrSubDirectories As String() = Directory.GetDirectories([Drive].ToString)
  5.                Dim strSubDirectory As String
  6.                For Each strSubDirectory In astrSubDirectories
  7.                    Dim direct As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
  8.  
  9.                    Try
  10.                        Dim astrFiles As String() = Directory.GetFiles([Drive].ToString & direct)
  11.                        ListBox1.Items.Add(strSubDirectory)
  12.                        For Each strFileName In astrFiles
  13.                            ListBox1.Items.Add(strFileName)
  14.                        Next
  15.  
  16.                    Catch exc As Exception
  17.  
  18.                    End Try
  19.                Next
  20.  
  21.                Try
  22.                    Dim DirInfo As New DirectoryInfo([Drive].ToString)
  23.                    For Each Files As System.IO.FileInfo In DirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)
  24.                        ListBox1.Items.Add([Drive].ToString & Files.ToString)
  25.                    Next
  26.                Catch ex As Exception
  27.               'MessageBox.Show(ex.Message)
  28.                End Try
  29.            Catch ex As Exception
  30.              'MessageBox.Show(ex.Message)
  31.            End Try
  32.  
  33.        Next




Pues finalmente creo que di con la solución. Bastaba con añadir esto ,
Código:
"*", SearchOption.AllDirectories
a al código anterior:

Código:
Dim astrFiles As String() = Directory.GetFiles("C:\" & direct, "*", SearchOption.AllDirectories)


Aquí te muestra todos los archivos de un directorio (con la ruta completa)[/size]

Código
  1.             Dim strDrive As String = "D:\" '[Drive].ToString
  2.        Dim DriveSubDirectories As String() = Directory.GetDirectories(strDrive)
  3.        For Each strSubDirectory As String In DriveSubDirectories
  4.            Dim strFolder As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
  5.            ListBox1.Items.Add(strSubDirectory) '<---Carpeta
  6.            Try
  7.                Dim strFiles As String() = Directory.GetFiles(strDrive & strFolder, "*", SearchOption.AllDirectories)
  8.                For Each strFileName In strFiles
  9.                    ListBox1.Items.Add(strFileName) '<--Archivo con ruta completa
  10.                Next
  11.            Catch ex As Exception
  12.                '   MessageBox.Show(ex.Message)
  13.            End Try 'strFiles
  14.        Next   'strSubDirectory
  15.        Try
  16.            Dim DirInfo As New DirectoryInfo(strDrive)
  17.            For Each Files As System.IO.FileInfo In DirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)
  18.                ListBox1.Items.Add(strDrive & Files.ToString)
  19.            Next
  20.        Catch ex As Exception
  21.        End Try 'DirInfo


Pero tarda bastante... según el número de archivos y subdirectorios...

Para obtener todos de todas las unidades

Código
  1.  
  2.           Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
  3.        For Each [Drive] In allDrives
  4.            Try
  5.                Dim strDrive As String = [Drive].ToString
  6.                Dim DriveSubDirectories As String() = Directory.GetDirectories(strDrive)
  7.                For Each strSubDirectory As String In DriveSubDirectories
  8.                    Dim strFolder As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
  9.                    ListBox1.Items.Add(strSubDirectory) '<---Carpeta
  10.                    Try
  11.                        Dim strFiles As String() = Directory.GetFiles(strDrive &
  12.                                                                      strFolder,
  13.                                                                      "*",
  14.                                                                      SearchOption.AllDirectories)
  15.                        For Each strFileName In strFiles
  16.                            ListBox1.Items.Add(strFileName) '<--Archivo con ruta completa
  17.                        Next 'strFileName
  18.                    Catch ex As Exception
  19.                        '   MessageBox.Show(ex.Message)
  20.                    End Try 'strFiles
  21.                Next  'strSubDirectory
  22.  
  23.                Try
  24.                    Dim DirInfo As New DirectoryInfo(strDrive)
  25.                    For Each Files As System.IO.FileInfo In DirInfo.GetFiles("*", SearchOption.TopDirectoryOnly)
  26.                        ListBox1.Items.Add(strDrive & Files.ToString)
  27.                    Next 'Files
  28.                Catch ex As Exception
  29.                    '   MessageBox.Show(ex.Message)
  30.                End Try 'DirInfo
  31.  
  32.            Catch ex As Exception
  33.                MessageBox.Show(ex.Message)
  34.            End Try 'Drives
  35.        Next '[Drive]
  36.  


Pero te va a tardar un guevo  :xD

**Se me olvidaba, para ver los archivos ocultos y otros protegidos del sistema basta con ejecutar la aplicación con privilegios de administrador.


« Última modificación: 23 Septiembre 2016, 18:08 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Listar ficheros
« Respuesta #2 en: 23 Septiembre 2016, 20:24 pm »

@okik

Un consejo, cuando el factor de la velocidad sea un requisito primordial entonces no uses las funciones Directory.Get***, en su lugar usa Directory.Enumerate***, así evitarás que se inicialicen todos los elementos de golpe en la colección.

Por lo demás, buen código, nada más que objetar, aunque el try/catch se puede remplazar por una evaluación de los permisos ACL del directorio, pero bueno, el resultado al fin y al cabo sería el mismo y con un try/catch se reduce bastante el tamaño del código resultante.

Saludos!
« Última modificación: 23 Septiembre 2016, 20:26 pm por Eleкtro » En línea



okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Listar ficheros
« Respuesta #3 en: 24 Septiembre 2016, 13:25 pm »

@Elektro he hecho lo que me has dicho.

Código
  1. Dim strFiles As IEnumerable = Directory.EnumerateFiles(strDrive & strFolder, "*", SearchOption.AllDirectories)

No he notado mucho la diferencia, pero supongo que algo hará. De todos modos es bueno conocer otras maneras. Cuando respondí, lo que hice en un principio fue probar el código  de @Tomas1982  y vi que no andaba bien y empecé a investigar, pero no  había hecho nunca con Net un buscador de archivos. Busqué en MSDN y ponían el Get.. y eso hice  :P Se ve la evolución en mi respuesta XD

Igualito que en VB, madre mía, no había que escribir ni nada para hacer eso. Pero molaba porque tenías que pensar y te daba ese gusanillo mental que cuando lo conseguías era como si te tocara la lotería.  Net es engorroso porque todo se basa en miembros y clases. Conocerlos todos, si es posible, es tedioso y fastidia cuando haces algo de diez líneas y luego descubres que hay una clase que te hace lo mismo en una. Otra cosa que fastidia son las actualizaciones y los métodos obsoletos. Que en la 2005 o 2010 se podían usar y luego en 2015 ya no, o al revés. Que palo.







En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Listar ficheros
« Respuesta #4 en: 24 Septiembre 2016, 14:44 pm »

@Elektro he hecho lo que me has dicho.

Código
  1. Dim strFiles As IEnumerable = Directory.EnumerateFiles(strDrive & strFolder, "*", SearchOption.AllDirectories)

No he notado mucho la diferencia, pero supongo que algo hará.

La diferencia está en que la colección Enumerable se devuelve practicamente al instante (mientras que Directory.GetFiles(...) tarda lo suyo como ya has comprobado) puesto que los elementos no se inicializan, por así decirlo, hasta que lo demandes, en este caso sería cuando iteras los elementos de la colección usando el FOR en tu código, por eso no notas una diferencia en velocidad, pero la hay, y aporta otros beneficios también.



Net es engorroso porque todo se basa en miembros y clases.

Bueno, quizás te parezca "engorroso" por que no estarás lo suficientemente acostumbrado al paradigma de programación orientado a objetos... pero eso es precisamente lo que hace tan versátiles y moldeables a este tipo de lenguajes.



Conocerlos todos, si es posible, es tedioso y fastidia cuando haces algo de diez líneas y luego descubres que hay una clase que te hace lo mismo en una.

Ya, eso nos ha pasado a todos, jeje!

Conocer todos los types y/o miembros de la librería de classes de .NET Framework es sencillamente algo imposible, es un set de librerías demasiado extenso y el cerebro humano no da para tanto, pero tampoco es necesario intentar conocerlo todo por que todo no lo vas a usar, eso sí, lo esencial es imprescindible conocerlo... y te recomiendo leer sobre Generics en .NET, si lo dominas te resultará una forma de programación muy util, la más util tal vez.

Saludos!
« Última modificación: 24 Septiembre 2016, 14:48 pm por Eleкtro » En línea



Tomas1982

Desconectado Desconectado

Mensajes: 48



Ver Perfil
Re: Listar ficheros
« Respuesta #5 en: 29 Septiembre 2016, 17:21 pm »

Gracias por la ayuda, el código esta muy bueno, espero que a otros usuarios también les sea muy útil.

 
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listar ficheros de un servidor
Java
keldorn 2 3,015 Último mensaje 18 Noviembre 2008, 18:32 pm
por Sk9ITk5Z
¿que diferencia ahi entre ficheros binarios y ficheros binarios con estructura?
Windows
Anonymous250 0 2,256 Último mensaje 10 Noviembre 2011, 13:37 pm
por Anonymous250
iDStore lista ficheros y directorios ocultos de ficheros .DS_Store
Nivel Web
MichBukana 0 3,580 Último mensaje 29 Agosto 2013, 09:21 am
por MichBukana
MOVIDO: Listar ficheros
Programación Visual Basic
Eleкtro 0 1,770 Último mensaje 23 Septiembre 2016, 16:53 pm
por Eleкtro
Listar archivos de 2 ficheros
.NET (C#, VB.NET, ASP)
PETTETE 1 2,153 Último mensaje 28 Julio 2017, 12:22 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines