estaban ocultos los archivos y crei que igual deberia listar los archivos sin importar los atributos de oculto
Efectivamente, la función GetFiles lista los archivos sin importar sus atributos.
No es necesario realizar cambios, aunque debo decir que para simplificar el código puedes utilizar el overload del método
My.Computer.FileSystem.GetFiles que acepta un array de extensiones, en lugar de realizar dos búsquedas distintas como estás haciendo ...eso es algo innecesario:
Imports Microsoft.VisualBasic.FileIO
Public Class TestForm
Private Sub TestForm_Shown() Handles MyBase.Shown
Dim folderPath As String = "C:\"
Dim fileExts As IEnumerable(Of String) = {"*.docx", "*.pptx"}
Dim filePaths As IEnumerable(Of String)
Dim lvItems As IEnumerable(Of ListViewItem)
Try
filePaths = From filePath As String In My.Computer.FileSystem.GetFiles(folderPath,
SearchOption.SearchAllSubDirectories,
fileExts.ToArray)
Catch ex As Exception
Throw
End Try
lvItems = From filePath As String In filePaths
Select New ListViewItem(filePath)
With Me.ListView1
.BeginUpdate()
.Items.AddRange(lvItems.ToArray)
.EndUpdate()
End With
End Sub
End Class
Aunque realmente deberías utilizar el método
Directory.GetFiles en lugar de usar los métodos del namespace
My, el cual carece del overload para asignar múltiples extensiones, pero sigue siendo mejor, ejemplo:
Imports System.IO
Public Class TestForm
Private Sub TestForm_Shown() Handles MyBase.Shown
Dim folderPath As String = "C:\"
Dim fileExts As IEnumerable(Of String) = {"docx", "pptx"}
Dim fInfoCol As IEnumerable(Of FileInfo)
Dim lvItems As IEnumerable(Of ListViewItem)
Try
fInfoCol = GetFiles(folderPath, fileExts, SearchOption.AllDirectories)
Catch ex As Exception
Throw
End Try
lvItems = From fInfo As FileInfo In fInfoCol
Select New ListViewItem(fInfo.FullName)
With Me.ListView1
.BeginUpdate()
.Items.AddRange(lvItems.ToArray)
.EndUpdate()
End With
End Sub
''' <summary>
''' Retrieves the files inside a directory,
''' containing the specified file extensions.
''' </summary>
''' <param name="folderPath">The directory path where to search files.</param>
''' <param name="fileExts">The file extensions to match.</param>
''' <param name="searchOption">The searching mode.</param>
''' <returns>IEnumerable(Of FileInfo).</returns>
Public Shared Function GetFiles(ByVal folderPath As String,
ByVal fileExts As IEnumerable(Of String),
ByVal searchOption As SearchOption) As IEnumerable(Of FileInfo)
' Set all the file extensions to lower-case and
' Remove empty file extensions and
' Remove "*" and "." chars from beginning of the file extension.
fileExts = From fileExt As String In fileExts
Where Not String.IsNullOrEmpty(fileExt)
Select fileExt.TrimStart({"*"c, "."c, " "c}).TrimEnd.ToLower
Return From filePath As String In Directory.GetFiles(folderPath, "*", searchOption)
Where If(Not String.IsNullOrEmpty(Path.GetExtension(filePath)),
fileExts.Contains(Path.GetExtension(filePath).TrimStart("."c).ToLower),
Nothing)
Select New FileInfo(filePath)
End Function
End Class
Sobre el problema en cuestión, el método que te da error lo hace por causa de un desbordamiento de la pila, el motivo no lo se, no debería suceder, seguramente el caracter que has comentado esté implicado en el error al ser un caracter ilegal para una carpeta y una vulnerabilidad de la que algunos virus se aprovechan, eso es lo que puede estar ocasionando dicho desbordamiento de alguna manera, el reconocimiento de esa carpeta.
¿No puedes simplemente renombrar la carpeta a otro nombre?.
Saludos