none
Pesquisa de arquivos em diretórios permitindo a abertura dos mesmos RRS feed

  • Pergunta

  • A rotina efetua uma pesquisa arquivos em diretório selecionado pelo usuário base a uma string também definida por ele.

    O objetivo é mostrar os arquivos que contém a string por ele selecionada, mostrar em um listbox e quando ele clica o arquivo é aberto.

    O problema é que funciona quando executo debugando e com um break em alguma linha do codigo, quando chamo pelo executavel diretamente ele não traz nada na tela.

    Agradeço qualquer dica, inclusive de lógica pois ainda estou "arranhando" no vb.

    Segue o codigo (um pouco longo) com os comentários abaixo.

    Grato

    Vinicius

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' Cursor para espera
            Me.Cursor = Cursors.WaitCursor
            'Retiro os espaços da string de pesquisa e transformo-a em maiusculo
            Dim pesquisa As String = LTrim(RTrim(TextBox1.Text))
            pesquisa = pesquisa.ToUpper
            'Defino o arquivo que contera os nomes dos arquivos pesquisados para "meus documentos" com o nome de pesquisa.txt
            Dim arqtexto As String = GetFolderPath(SpecialFolder.MyDocuments) + "\pesquisa.txt"
            'Defino o comando para preencher o arquivo texto acima "dir /s /b" = todos os arquivos do diretorio e do subdiretorio selecionado no textbox2 e com a mascara do combobox2
            Dim expressao As String = "/c dir " + TextBox2.Text + ComboBox2.Text + " /s /b > " + arqtexto
            'Default de pasta publica
            If TextBox1.Text = "PASTA PÚBLICA" Then
                expressao = "/c dir " + "c:\publica\" + ComboBox2.Text + " /s /b > " + arqtexto
            End If
            'Criamos um processo com o comando do DOS cmd
            Dim objprocess As New Process
            objprocess.StartInfo.FileName = "cmd.exe"
            objprocess.StartInfo.Arguments = expressao
            'Limpamos o listbox
            ListBox1.Items.Clear()
            'Se o arquivo ja existir em "meus documentos" eu deleto
            If IO.File.Exists(arqtexto) Then
                File.Delete(arqtexto)
            End If
            'Iniciando o processo
            Try
                objprocess.Start()
                'Se o arquivo existir lemos e apresentamos os dados que satisfaçam a pesquisa no listbox
                If IO.File.Exists(arqtexto) Then
                    Dim fluxoTexto = New IO.StreamReader(arqtexto)
                    Dim linhaTexto As String
                    While Not fluxoTexto.EndOfStream
                        linhaTexto = fluxoTexto.ReadLine
                        linhaTexto = linhaTexto.ToUpper
                        If linhaTexto.Contains(pesquisa) Then
                            ListBox1.Items.Add(linhaTexto)
                        End If
                    End While
                    'Fechamos o arquivo texto e limpamos as variaveis usadas nesta fase
                    fluxoTexto.Close()
                    fluxoTexto = Nothing
                    linhaTexto = Nothing
                End If
            Catch
                MessageBox.Show("PESQUISA NÃO ENCONTRADA")
            Finally
                'Limpamos as variaveis e voltamos o cursor para default
                pesquisa = Nothing
                arqtexto = Nothing
                expressao = Nothing
                objprocess = Nothing
                Me.Cursor = Cursors.Default
            End Try

    domingo, 21 de setembro de 2014 01:29

Respostas

  • Olá,

    Reelaborei seu código na forma abaixo. Veja se é o que você precisa:

    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Limpa uma eventual pesquisa anterior
            ListBox1.Items.Clear()
    
            'Verifica se o texto da pesquisa é válido, e caso não for, mostra uma mensagem e sai da rotina
            If String.IsNullOrWhiteSpace(FormatarPesquisa(TextBox1.Text)) Then
                MsgBox("Texto de pesquisa inválido", MsgBoxStyle.Exclamation)
                Exit Sub
            End If
    
            'As quatro linhas abaixo server para criar um dialogo no qual o usuário
            'poderá selecionar a pasta onde deseja realizar a pesquisa.
            'O caminho para a Pasta será armazenado na variável Pasta.
            Dim Pasta As String
            Dim dialogo As New FolderBrowserDialog
            If dialogo.ShowDialog() = Windows.Forms.DialogResult.Cancel Then Exit Sub
            Pasta = dialogo.SelectedPath
    
            Dim pesquisa As String = FormatarPesquisa(TextBox1.Text)
            'Essa linha abaixo executa a pesquisa na pasta selecionada usando os dados de pesquisa pré definidos
            ' o parâmetro IO.SearchOption.AllDirectories indica que a pesquisa será realizada na pasta e em suas subpastas
            Dim arquivos() As String = System.IO.Directory.GetFiles(Pasta, pesquisa, IO.SearchOption.AllDirectories)
    
            'Adiciona ao ListBox todos os arquivos que correspondem à pesquisa.
            ListBox1.Items.AddRange(arquivos)
        End Sub
    
        'Esta função serve para remover eventuais caracteres inválidos do texto da pesquisa
        Public Function FormatarPesquisa(Pesquisa As String) As String
            'Pega uma lista de caracteres que não devem existir em nomes de arquivos
            Dim caracteresInvalidos() As Char = System.IO.Path.GetInvalidFileNameChars()
            'Retira caractere inválido, um a um
            For Each ch As Char In caracteresInvalidos
                Pesquisa = Pesquisa.Replace(ch, "")
            Next
    
            'Adiciona os caracteres *
            'Estes caracteres servem para indicar que pode haver ou não, outros caracteres à direita ou à esquerda da palavra de pesquisa
            'Um exemplo prático: Palavra de pesquisa é Foto
            'Você seleciona uma pasta que contem arquivos com a palavra Foto no nome, mas não apenas foto:
            'C:\Imagens\Foto Totó.jpg
            'C:\Imagens\Foto Girafa.jpg
            'C:\Imagens\Foto Filé Miau.jpg
            'Por isso deve-se formatar a pesquisa assim *foto*, pois o nome dos arquivos possui caracteres à direita da palavra foto
    
            Return "*" + Pesquisa + "*"
        End Function
    
        Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick
            ' Se o usuário der um duplo click no listBox e algum arquivo estiver Selecionado, abre este arquivo
            If ListBox1.SelectedItem <> Nothing Then
                Process.Start(ListBox1.SelectedItem)
            End If
        End Sub
    
    End Class
    

    Como está arranhando no VB, sugiro que visite este ótimo site com muito conteúdo de qualidade voltado à iniciantes:

    Macoratti.net - Quase tudo para Visual Basic


    Herbert Lausmann

    • Marcado como Resposta Vinicius Betto domingo, 21 de setembro de 2014 11:04
    domingo, 21 de setembro de 2014 10:40

Todas as Respostas

  • Olá,

    Reelaborei seu código na forma abaixo. Veja se é o que você precisa:

    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Limpa uma eventual pesquisa anterior
            ListBox1.Items.Clear()
    
            'Verifica se o texto da pesquisa é válido, e caso não for, mostra uma mensagem e sai da rotina
            If String.IsNullOrWhiteSpace(FormatarPesquisa(TextBox1.Text)) Then
                MsgBox("Texto de pesquisa inválido", MsgBoxStyle.Exclamation)
                Exit Sub
            End If
    
            'As quatro linhas abaixo server para criar um dialogo no qual o usuário
            'poderá selecionar a pasta onde deseja realizar a pesquisa.
            'O caminho para a Pasta será armazenado na variável Pasta.
            Dim Pasta As String
            Dim dialogo As New FolderBrowserDialog
            If dialogo.ShowDialog() = Windows.Forms.DialogResult.Cancel Then Exit Sub
            Pasta = dialogo.SelectedPath
    
            Dim pesquisa As String = FormatarPesquisa(TextBox1.Text)
            'Essa linha abaixo executa a pesquisa na pasta selecionada usando os dados de pesquisa pré definidos
            ' o parâmetro IO.SearchOption.AllDirectories indica que a pesquisa será realizada na pasta e em suas subpastas
            Dim arquivos() As String = System.IO.Directory.GetFiles(Pasta, pesquisa, IO.SearchOption.AllDirectories)
    
            'Adiciona ao ListBox todos os arquivos que correspondem à pesquisa.
            ListBox1.Items.AddRange(arquivos)
        End Sub
    
        'Esta função serve para remover eventuais caracteres inválidos do texto da pesquisa
        Public Function FormatarPesquisa(Pesquisa As String) As String
            'Pega uma lista de caracteres que não devem existir em nomes de arquivos
            Dim caracteresInvalidos() As Char = System.IO.Path.GetInvalidFileNameChars()
            'Retira caractere inválido, um a um
            For Each ch As Char In caracteresInvalidos
                Pesquisa = Pesquisa.Replace(ch, "")
            Next
    
            'Adiciona os caracteres *
            'Estes caracteres servem para indicar que pode haver ou não, outros caracteres à direita ou à esquerda da palavra de pesquisa
            'Um exemplo prático: Palavra de pesquisa é Foto
            'Você seleciona uma pasta que contem arquivos com a palavra Foto no nome, mas não apenas foto:
            'C:\Imagens\Foto Totó.jpg
            'C:\Imagens\Foto Girafa.jpg
            'C:\Imagens\Foto Filé Miau.jpg
            'Por isso deve-se formatar a pesquisa assim *foto*, pois o nome dos arquivos possui caracteres à direita da palavra foto
    
            Return "*" + Pesquisa + "*"
        End Function
    
        Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick
            ' Se o usuário der um duplo click no listBox e algum arquivo estiver Selecionado, abre este arquivo
            If ListBox1.SelectedItem <> Nothing Then
                Process.Start(ListBox1.SelectedItem)
            End If
        End Sub
    
    End Class
    

    Como está arranhando no VB, sugiro que visite este ótimo site com muito conteúdo de qualidade voltado à iniciantes:

    Macoratti.net - Quase tudo para Visual Basic


    Herbert Lausmann

    • Marcado como Resposta Vinicius Betto domingo, 21 de setembro de 2014 11:04
    domingo, 21 de setembro de 2014 10:40
  • Bom dia,

    Perfeito Herbert.

    Vou adapta-lo a minhas necessidades mudando pouca coisa.

    Abraço

    Vinicius Betto

    domingo, 21 de setembro de 2014 11:04