2015-05-20 3 views
0

Нам нужно освободить место на одном из наших сетевых жестких дисков. В рассматриваемом каталоге содержится 526 ГБ данных, 180914 файлов в 13555 каталогах.Слишком длинный поиск файла

Итак, я написал код, чтобы найти копии файлов. Пользователь указывает файл для поиска, и приложение находит все экземпляры файла. Он отлично работает, за исключением нескольких минут. Я не удивлен этим, но тот же поиск в Windows Explorer быстрее.

Причина, по которой я думаю, это потому, что я запускаю свое приложение, а затем выполняю тот же поиск в проводнике Windows, который ищет ту же папку для того же файла.

Существует одна разница, и я просто не знаю, сколько это будет важно ...

Поскольку некоторые из искомых файлов имеют одинаковые имена (например ОПЕРАЦИИ Manual.pdf), но разные, я сравниваю размер, когда я получаю удар. Таким образом, поиск находит файл, и я проверяю размер файла, возвращая только те, у которых одинаковые имена и размеры файлов.

я получаю 5 в частности, поиск и исследователь возвращает 74.

Мое приложение занимает 2 минуты и исследователь занимает 1 минуту.

Есть ли что-нибудь, что я могу сделать, чтобы быть более эффективным? Я бы ожидал, что я смогу приблизиться к тому, что делает исследователь для производительности.

Вот код ...

'find all instances of the file 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     'first clear the listbox 
     LB_Files.Items.Clear() 


     'set the lbel text for the list box 
     Label1.Text = "Finding all instances of: " & TB_File.Text & " in directory: " & TB_Drive.Text & " and all sub-driectories... PLEASE STAND BY" 
     'make sure the label updates 
     Me.Refresh() 

     'run through and find each file and add it to the listbox 
     For Each foundFile As String In My.Computer.FileSystem.GetFiles(TB_Drive.Text, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, TB_File.Text) 

      'check if the file is a shortcut and if it is do nothing 
      If foundFile.Contains(".lnk") Then 

      Else 

       Dim infoReader As System.IO.FileInfo 
       infoReader = My.Computer.FileSystem.GetFileInfo(foundFile) 
       newfilesize = infoReader.Length 
       'MsgBox("The old file size is: " & oldfilesize & ", and the new file size is: " & newfilesize) 
       'for each file that is not a shortcut, add it to the list box 

       'check if the file sizes match, don't want to add a file if it is not the same file 
       If newfilesize = oldfilesize Then 

        LB_Files.Items.Add(foundFile) 
        'update the file count 
        count = count + 1 
        newfilesize = 0 

       End If 
       'reset the newfilesize 
       newfilesize = 0 
      End If 


     Next 
     'once we find all the files, change the lable to say how many we have. 
     Label1.Text = "Found " & count.ToString & " instances of " & TB_File.Text & "." 

    End Sub 

ответ

0

ли сервер окна?

Если это так, то я бы не стал беспокоиться об итеративном поиске и узнал больше о файловой системе. Вы можете найти файлы намного быстрее, выполнив поиск индекса.

посмотреть на Fast Search On FAT32/NTFS File System

из принятого ответа вы найдете SourceForge проект, который индексирует диск - превратить эту часть в VB и вуаля супер быстрый способ поиска файлов. В качестве альтернативы вы можете использовать один из многих бесплатных инструментов для этого.

Смежные вопросы