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"
Task.Factory.StartNew(Sub()
Me.Invoke(Sub() Me.Cursor = Cursors.WaitCursor)
For Each vUnidad As String In Directory.GetLogicalDrives()
ListBox1.Invoke(DirectCast(Sub() ListBox1.Items.Add(vUnidad), MethodInvoker))
Next vUnidad
''Recorrer las unidades detectadas
Dim Pdisco As String
For i As Integer = 0 To Me.ListBox1.Items.Count - 1
Pdisco = CStr(ListBox1.Items(i))
'Obtener los ficheros de las unidades
Try
Dim DirInfo As New DirectoryInfo(Pdisco)
For Each Files As System.
IO.
FileInfo In DirInfo.
GetFiles("*", SearchOption.
TopDirectoryOnly) ListBox2.
Invoke(DirectCast
(Sub() ListBox2.
Items.
Add(Pdisco
& Files.
ToString), MethodInvoker
)) Next
Catch ex As Exception
End Try
Next
End Sub).ContinueWith(Sub()
Me.Invoke(Sub() Me.Cursor = Cursors.Arrow)
End Sub)
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.NETchau
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.
Dim strDirPath As String = "C:\"
Dim astrSubDirectories As String() = Directory.GetDirectories(strDirPath)
Dim strSubDirectory As String
For Each strSubDirectory In astrSubDirectories
Dim direct As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
Try
Dim astrFiles As String() = Directory.GetFiles(strDirPath & direct)
ListBox1.Items.Add(strSubDirectory)
For Each strFileName In astrFiles
ListBox1.Items.Add(strFileName)
Next
Catch exc As Exception
End Try
Next
Try
Dim DirInfo As New DirectoryInfo(strDirPath)
For Each Files As System.
IO.
FileInfo In DirInfo.
GetFiles("*", SearchOption.
TopDirectoryOnly) ListBox1.
Items.
Add(strDirPath
& Files.
ToString) Next
Catch ex As Exception
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.
Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
For Each [Drive] In allDrives
Try
Dim astrSubDirectories
As String() = Directory.
GetDirectories([Drive].
ToString) Dim strSubDirectory As String
For Each strSubDirectory In astrSubDirectories
Dim direct As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
Try
Dim astrFiles
As String() = Directory.
GetFiles([Drive].
ToString & direct
) ListBox1.Items.Add(strSubDirectory)
For Each strFileName In astrFiles
ListBox1.Items.Add(strFileName)
Next
Catch exc As Exception
End Try
Next
Try
Dim DirInfo
As New DirectoryInfo
([Drive].
ToString) For Each Files As System.
IO.
FileInfo In DirInfo.
GetFiles("*", SearchOption.
TopDirectoryOnly) ListBox1.
Items.
Add([Drive].
ToString & Files.
ToString) Next
Catch ex As Exception
'MessageBox.Show(ex.Message)
End Try
Catch ex As Exception
'MessageBox.Show(ex.Message)
End Try
Next
Pues finalmente creo que di con la solución. Bastaba con añadir esto ,
"*", SearchOption.AllDirectories
a al código anterior:
Dim astrFiles As String() = Directory.GetFiles("C:\" & direct, "*", SearchOption.AllDirectories)
Aquí te muestra todos los archivos de un directorio (con la ruta completa)[/size]
Dim strDrive As String = "D:\" '[Drive].ToString
Dim DriveSubDirectories As String() = Directory.GetDirectories(strDrive)
For Each strSubDirectory As String In DriveSubDirectories
Dim strFolder As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
ListBox1.Items.Add(strSubDirectory) '<---Carpeta
Try
Dim strFiles As String() = Directory.GetFiles(strDrive & strFolder, "*", SearchOption.AllDirectories)
For Each strFileName In strFiles
ListBox1.Items.Add(strFileName) '<--Archivo con ruta completa
Next
Catch ex As Exception
' MessageBox.Show(ex.Message)
End Try 'strFiles
Next 'strSubDirectory
Try
Dim DirInfo As New DirectoryInfo(strDrive)
For Each Files As System.
IO.
FileInfo In DirInfo.
GetFiles("*", SearchOption.
TopDirectoryOnly) ListBox1.
Items.
Add(strDrive
& Files.
ToString) Next
Catch ex As Exception
End Try 'DirInfo
Pero tarda bastante... según el número de archivos y subdirectorios...
Para obtener todos de todas las unidades
Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
For Each [Drive] In allDrives
Try
Dim strDrive
As String = [Drive].
ToString Dim DriveSubDirectories As String() = Directory.GetDirectories(strDrive)
For Each strSubDirectory As String In DriveSubDirectories
Dim strFolder As String = strSubDirectory.Remove(0, strSubDirectory.LastIndexOf("\") + 1)
ListBox1.Items.Add(strSubDirectory) '<---Carpeta
Try
Dim strFiles As String() = Directory.GetFiles(strDrive &
strFolder,
"*",
SearchOption.AllDirectories)
For Each strFileName In strFiles
ListBox1.Items.Add(strFileName) '<--Archivo con ruta completa
Next 'strFileName
Catch ex As Exception
' MessageBox.Show(ex.Message)
End Try 'strFiles
Next 'strSubDirectory
Try
Dim DirInfo As New DirectoryInfo(strDrive)
For Each Files As System.
IO.
FileInfo In DirInfo.
GetFiles("*", SearchOption.
TopDirectoryOnly) ListBox1.
Items.
Add(strDrive
& Files.
ToString) Next 'Files
Catch ex As Exception
' MessageBox.Show(ex.Message)
End Try 'DirInfo
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try 'Drives
Next '[Drive]
Pero te va a tardar un guevo
**Se me olvidaba,
para ver los archivos ocultos y otros protegidos del sistema basta con ejecutar la aplicación con privilegios de administrador.