2011-12-30 3 views
1

Привет всем Я пытался найти указанный каталог и все подкаталоги для всех файлов с указанным расширением файла. Однако встроенная команда бесполезна, так как она ошибается и умирает, если у вас нет доступа к каталогу. Итак, вот что у меня есть на данный момент:Поиск по расширениям файлов VB.NET

Private Function dirSearch(ByVal path As String, Optional ByVal searchpattern As String = ".exe") As String() 
    Dim di As New DirectoryInfo(path) 
    Dim fi As FileInfo 
    Dim filelist() As String 
    Dim i As Integer = 0 
    For Each fi In di.GetFiles 
     If System.IO.Path.GetExtension(fi.FullName).ToLower = searchpattern Then 
      filelist(i) = fi.FullName 
      i += 1 
     End If 
    Next 
    Return filelist 
End Function 

Однако я получаю «: ссылка на объект не указывает на экземпляр объекта System.NullReferenceException.» когда я пытаюсь получить доступ к данным, хранящимся в массиве строк списка файлов.

Любая идея о том, что я делаю неправильно?

+0

fileList никогда не был создан. –

ответ

2

Вы не создали экземпляр массива Dim filelist() As String. Попробуйте di.GetFiles(searchPattern)

Dim files() as FileInfo = di.GetFiles(searchPattern) 

Используйте статический метод Directory.GetFiles, который возвращает массив строк

Dim files = Directory.GetFiles(Path,searchPattern,searchOption) 

Демо:

Dim files() As String 
files = Directory.GetFiles(path, "*.exe", SearchOption.TopDirectoryOnly) 
For Each FileName As String In files 
    Console.WriteLine(FileName) 
Next 

Рекурсивный обход каталогов:

Sub Main() 
     Dim path = "c:\jam" 
     Dim fileList As New List(Of String) 

     GetAllAccessibleFiles(path, fileList) 

     'Convert List<T> to string array if you want 
     Dim files As String() = fileList.ToArray 

     For Each s As String In fileList 
      Console.WriteLine(s) 
     Next 
    End Sub 

    Sub GetAllAccessibleFiles(path As String, filelist As List(Of String)) 
     For Each file As String In Directory.GetFiles(path, "*.*") 
      filelist.Add(file) 
     Next 
     For Each dir As String In Directory.GetDirectories(path) 
      Try 
       GetAllAccessibleFiles(dir, filelist) 
      Catch ex As Exception 

      End Try 
     Next 
    End Sub 
+0

Я пробовал «Dim files() как FileInfo = di.GetFiles (searchPattern)», но я получаю значение типа 1-мерного массива System.IO.FileInfo не может быть преобразован в System.IO.FileInfo – crackruckles

+0

ok, поэтому я получил ваш способ работать, но когда я меняю его на SearchOption.AllDirectories, я получаю проблемы, когда он попадает в папку, к которой у вас нет доступа. Мне нужно это, чтобы иметь возможность игнорировать папки, которые он не может получить и двигаться дальше. Любая идея - это последнее, что мне нужно сделать, чтобы закончить это маленькое приложение? – crackruckles

+0

Большое спасибо за вашу помощь в этом, вы спасатель жизни. – crackruckles

0

Использование S ystem.IO.Directory.EnumerateFiles и передать SearchOption.AllDirectories для перемещения по дереву с использованием определенного шаблона поиска. Вот пример:

foreach (var e in Directory.EnumerateFiles("C:\\windows", "*.dll", SearchOption.AllDirectories)) 
{ 
    Console.WriteLine(e); 
}