Usuário com melhor resposta
Pesquisa de arquivos em diretórios permitindo a abertura dos mesmos

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
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
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
-