LOCALIZAR ARQUIVOS !!
Boa noite !!
Gostaria de uma ajuda !!
Estou tentando localizar arquivos no windows, mas eu so consigo localizar o arquivo quando o nome dele esta exatamente igual na busca que faço com o codigo abaixo :
For Each arquivo As String In Directory.GetFiles([Ô]C:\Pasta\[Ô], [Ô]*.doc[Ô], SearchOption.AllDirectories)
lstDiretorios.Items.Add((arquivo))
ListBox1.Items.Add((arquivo))
Next
Porem o problema é que necessito fazer a busca,mas como se fosse um select com like do SQL , pois existem arquivos com nome parecidos e gostaria de trazer todos os arquivos como o proprio search do windows , pois existira casos que a unica coisa que muda entre alguns arquivos sera a ultima silaba , sendo assim se alguem tiver uma ideia , agradeco desde já.
Gostaria de uma ajuda !!
Estou tentando localizar arquivos no windows, mas eu so consigo localizar o arquivo quando o nome dele esta exatamente igual na busca que faço com o codigo abaixo :
For Each arquivo As String In Directory.GetFiles([Ô]C:\Pasta\[Ô], [Ô]*.doc[Ô], SearchOption.AllDirectories)
lstDiretorios.Items.Add((arquivo))
ListBox1.Items.Add((arquivo))
Next
Porem o problema é que necessito fazer a busca,mas como se fosse um select com like do SQL , pois existem arquivos com nome parecidos e gostaria de trazer todos os arquivos como o proprio search do windows , pois existira casos que a unica coisa que muda entre alguns arquivos sera a ultima silaba , sendo assim se alguem tiver uma ideia , agradeco desde já.
Já ouviu falar nos caracteres curinga?
Cara,
Imagino que o que você quer é basicamente isto:
Suponha que, na ListBox1, tenhamos três itens:
.doc
.xls
.pdf
Ok. Então farÃamos um código como este:
O que acontece?
O código pegará o texto selecionado na ListBox1 (suponha que eu tenha esclhido [Ô].doc[Ô];
fará uma busca (neste exemplo) na pasta [Ô]Meus documentos[Ô];
e irá inserir, na ListBox2, somente os nomes dos arquivos que contenham [Ô].doc[Ô]
Exemplo: Documento1.docx, Relatório.doc, trabalho de casa.docx, etc
Bom... é isso
Imagino que o que você quer é basicamente isto:
Suponha que, na ListBox1, tenhamos três itens:
.doc
.xls
Ok. Então farÃamos um código como este:
Dim Parametro As String = ListBox1.Text
ListBox2.Items.Clear()
Dim query =[txt-color=#0000f0] From [/txt-color]Arquivos [txt-color=#0000f0]In My[/txt-color].Computer.FileSystem.GetFiles([txt-color=#0000f0]My[/txt-color].Computer.FileSystem.SpecialDirectories.MyDocuments) _
[txt-color=#0000f0]Where[/txt-color] Arquivos.Contains(Parametro) _
[txt-color=#0000f0]Select[/txt-color] Arquivos
For Each Item As String In query
ListBox2.Items.Add(Item)
Next
O que acontece?
O código pegará o texto selecionado na ListBox1 (suponha que eu tenha esclhido [Ô].doc[Ô];
fará uma busca (neste exemplo) na pasta [Ô]Meus documentos[Ô];
e irá inserir, na ListBox2, somente os nomes dos arquivos que contenham [Ô].doc[Ô]
Exemplo: Documento1.docx, Relatório.doc, trabalho de casa.docx, etc
Bom... é isso
CLASSE:
(clsProcuraArquivos.vb)
Option Strict On
Option Explicit On
Imports System.IO
Imports System.Collections.Specialized
Public Class clsProcuraArquivos
Private Const DefaultFileMask As String = [Ô]*.*[Ô]
Private Const DefaultDirectoryMask As String = [Ô]*[Ô]
#Region [Ô] Member Variables [Ô]
Private _InitialDirectory As DirectoryInfo
Private _DirectoryMasks As StringCollection
Private _FileMasks As StringCollection
[ô]
Private _Directories As New ArrayList
Private _Files As New ArrayList
#End Region
#Region [Ô] Properites [Ô]
Public Property InitialDirectory() As DirectoryInfo
Get
Return _InitialDirectory
End Get
Set(ByVal Value As DirectoryInfo)
_InitialDirectory = Value
End Set
End Property
Public Property DirectoryMask() As StringCollection
Get
Return _DirectoryMasks
End Get
Set(ByVal Value As StringCollection)
_DirectoryMasks = Value
End Set
End Property
Public Property FileMask() As StringCollection
Get
Return _FileMasks
End Get
Set(ByVal Value As StringCollection)
_FileMasks = Value
End Set
End Property
Public ReadOnly Property Directories() As ArrayList
Get
Return _Directories
End Get
End Property
Public ReadOnly Property Files() As ArrayList
Get
Return _Files
End Get
End Property
#End Region
#Region [Ô] Constructors [Ô]
Public Sub New()
End Sub
Public Sub New( _
ByVal BaseDirectory As String)
Me.New(New DirectoryInfo(BaseDirectory))
End Sub
Public Sub New( _
ByVal InitialDirectory As DirectoryInfo)
_InitialDirectory = InitialDirectory
End Sub
#End Region
Public Overloads Sub Search(ByVal InitalDirectory As String, _
Optional ByVal FileMask As String = Nothing, _
Optional ByVal DirectoryMask As String = Nothing)
If InitalDirectory <> strProgramFiles Then
Search( _
New DirectoryInfo(InitalDirectory), _
FileMask, _
DirectoryMask _
)
End If
End Sub
Public Overloads Sub Search( _
Optional ByVal InitalDirectory As DirectoryInfo = Nothing, _
Optional ByVal FileMask As String = Nothing, _
Optional ByVal DirectoryMask As String = Nothing)
_Files = New ArrayList
_Directories = New ArrayList
If Not IsNothing(InitalDirectory) Then
_InitialDirectory = InitalDirectory
End If
If IsNothing(_InitialDirectory) Then
Throw New ArgumentException([Ô]A Directory Must be specified![Ô], [Ô]Directory[Ô])
End If
If IsNothing(FileMask) OrElse FileMask.Length = 0 Then
_FileMasks = New StringCollection
_FileMasks.Add(DefaultFileMask)
Else
_FileMasks = ParseMask(FileMask)
End If
If IsNothing(DirectoryMask) OrElse DirectoryMask.Length > 0 Then
_DirectoryMasks = New StringCollection
_DirectoryMasks.Add(DefaultDirectoryMask)
Else
_DirectoryMasks = ParseMask(DirectoryMask)
End If
DoSearch(_InitialDirectory)
End Sub
Private Sub DoSearch(ByVal BaseDirectory As DirectoryInfo)
Try
For Each fm As String In _FileMasks
Files.AddRange(BaseDirectory.GetFiles(fm))
Next
_
Catch u As UnauthorizedAccessException
[ô]Siliently Ignore this error, there isnt any simple
[ô]way to avoid this error.
End Try
Try
Dim Directories As New ArrayList
For Each dm As String In _DirectoryMasks
Directories.AddRange(BaseDirectory.GetDirectories(dm))
_Directories.AddRange(Directories)
Next
For Each di As DirectoryInfo In Directories
DoSearch(di)
Next
Catch u As UnauthorizedAccessException
[ô]Siliently Ignore this error, there isnt any simple
[ô]way to avoid this error.
End Try
End Sub
[ô]Masks are formated like *.jpeg;*.jpg
Private Shared Function ParseMask(ByVal Mask As String) As StringCollection
If IsNothing(Mask) Then
Return Nothing
End If
Mask = Mask.Trim([Ô];[Ô]c)
If Mask.Length = 0 Then
Return Nothing
End If
Dim Masks As New StringCollection
Masks.AddRange(Mask.Split([Ô];[Ô]c))
Return Masks
End Function
Protected Overrides Sub Finalize()
_Files = Nothing
_Directories = Nothing
MyBase.Finalize()
End Sub
End Class
FORM
Utilização dentro do form:
Dim x As New clsProcuraArquivos()
x.Search(dirs(i), word)
For Each f As System.IO.FileInfo In x.Files
msgbox(f.FullName.ToString())
Next
O resto é contigo, essa classe foi a melhor que eu já usei até hoje pois mesmo os arquivos protegidos pelo sistema operacional ou diretórios de sistema ele não acusa nehum erro na procura.
(clsProcuraArquivos.vb)
Option Strict On
Option Explicit On
Imports System.IO
Imports System.Collections.Specialized
Public Class clsProcuraArquivos
Private Const DefaultFileMask As String = [Ô]*.*[Ô]
Private Const DefaultDirectoryMask As String = [Ô]*[Ô]
#Region [Ô] Member Variables [Ô]
Private _InitialDirectory As DirectoryInfo
Private _DirectoryMasks As StringCollection
Private _FileMasks As StringCollection
[ô]
Private _Directories As New ArrayList
Private _Files As New ArrayList
#End Region
#Region [Ô] Properites [Ô]
Public Property InitialDirectory() As DirectoryInfo
Get
Return _InitialDirectory
End Get
Set(ByVal Value As DirectoryInfo)
_InitialDirectory = Value
End Set
End Property
Public Property DirectoryMask() As StringCollection
Get
Return _DirectoryMasks
End Get
Set(ByVal Value As StringCollection)
_DirectoryMasks = Value
End Set
End Property
Public Property FileMask() As StringCollection
Get
Return _FileMasks
End Get
Set(ByVal Value As StringCollection)
_FileMasks = Value
End Set
End Property
Public ReadOnly Property Directories() As ArrayList
Get
Return _Directories
End Get
End Property
Public ReadOnly Property Files() As ArrayList
Get
Return _Files
End Get
End Property
#End Region
#Region [Ô] Constructors [Ô]
Public Sub New()
End Sub
Public Sub New( _
ByVal BaseDirectory As String)
Me.New(New DirectoryInfo(BaseDirectory))
End Sub
Public Sub New( _
ByVal InitialDirectory As DirectoryInfo)
_InitialDirectory = InitialDirectory
End Sub
#End Region
Public Overloads Sub Search(ByVal InitalDirectory As String, _
Optional ByVal FileMask As String = Nothing, _
Optional ByVal DirectoryMask As String = Nothing)
If InitalDirectory <> strProgramFiles Then
Search( _
New DirectoryInfo(InitalDirectory), _
FileMask, _
DirectoryMask _
)
End If
End Sub
Public Overloads Sub Search( _
Optional ByVal InitalDirectory As DirectoryInfo = Nothing, _
Optional ByVal FileMask As String = Nothing, _
Optional ByVal DirectoryMask As String = Nothing)
_Files = New ArrayList
_Directories = New ArrayList
If Not IsNothing(InitalDirectory) Then
_InitialDirectory = InitalDirectory
End If
If IsNothing(_InitialDirectory) Then
Throw New ArgumentException([Ô]A Directory Must be specified![Ô], [Ô]Directory[Ô])
End If
If IsNothing(FileMask) OrElse FileMask.Length = 0 Then
_FileMasks = New StringCollection
_FileMasks.Add(DefaultFileMask)
Else
_FileMasks = ParseMask(FileMask)
End If
If IsNothing(DirectoryMask) OrElse DirectoryMask.Length > 0 Then
_DirectoryMasks = New StringCollection
_DirectoryMasks.Add(DefaultDirectoryMask)
Else
_DirectoryMasks = ParseMask(DirectoryMask)
End If
DoSearch(_InitialDirectory)
End Sub
Private Sub DoSearch(ByVal BaseDirectory As DirectoryInfo)
Try
For Each fm As String In _FileMasks
Files.AddRange(BaseDirectory.GetFiles(fm))
Next
_
Catch u As UnauthorizedAccessException
[ô]Siliently Ignore this error, there isnt any simple
[ô]way to avoid this error.
End Try
Try
Dim Directories As New ArrayList
For Each dm As String In _DirectoryMasks
Directories.AddRange(BaseDirectory.GetDirectories(dm))
_Directories.AddRange(Directories)
Next
For Each di As DirectoryInfo In Directories
DoSearch(di)
Next
Catch u As UnauthorizedAccessException
[ô]Siliently Ignore this error, there isnt any simple
[ô]way to avoid this error.
End Try
End Sub
[ô]Masks are formated like *.jpeg;*.jpg
Private Shared Function ParseMask(ByVal Mask As String) As StringCollection
If IsNothing(Mask) Then
Return Nothing
End If
Mask = Mask.Trim([Ô];[Ô]c)
If Mask.Length = 0 Then
Return Nothing
End If
Dim Masks As New StringCollection
Masks.AddRange(Mask.Split([Ô];[Ô]c))
Return Masks
End Function
Protected Overrides Sub Finalize()
_Files = Nothing
_Directories = Nothing
MyBase.Finalize()
End Sub
End Class
FORM
Utilização dentro do form:
Dim x As New clsProcuraArquivos()
x.Search(dirs(i), word)
For Each f As System.IO.FileInfo In x.Files
msgbox(f.FullName.ToString())
Next
O resto é contigo, essa classe foi a melhor que eu já usei até hoje pois mesmo os arquivos protegidos pelo sistema operacional ou diretórios de sistema ele não acusa nehum erro na procura.
Pegudo :
tem alguma coisa que nao esta funcionando , pois fiz alguns testes e da forma que esta, traz tudo que existe dentro da pasta , acho que o caminho deva ser esse mas posso estar fazendo alguma besteira !!
E tambem vou tentar explicar melhor o problema nao é com a extensao do arquivo e sim com seu nome em especifico , por exemplo : tenho dentro de um diretorio varias pastas e esses pastas tem seus nomes bem semelhantes, como por exemplo uma pasta com o nome A123456-H, outra pasta com o nome A1234567-J, outra pasta com o nome A1234570-0 e assim por diante, sendo assim existem uma centena de pastas semelhantes assim, então gostaria de fazer como se fosse a pesquisa do windows, em uma caixa de texto eu coloque por exemplo o texto A12345 e fosse feito um filtro e me mostrasse as pastas que iniciassem com essas iniciais.
No select do SQL se eu faço o filtro da tabela com nomes por exemplo, e quando digito a letra [Ô]A[Ô] a tabela ja filtra todos os nomes que iniciam com a letra [Ô]A[Ô] se continuar digitando por exemplo [Ô]Ar[Ô] a tabela já ira filtrar todos os nomes que iniciem com [Ô]Ar[Ô] e assim sucessivamente, não sei se piorei a explicacão ou ajudou em algo.
Alevale :
Acho que necessito fazer alguma referencia, pois esta dando erro e quando quero chamar a classe também esta dando erro.
normalmente faço referencia a classe e depois apenas digito a classe e passo os valores que estão entre parenteses para serem utilizados, mas no seu exemplo voce chama a classe depois chama outra referencia que não faz parte da classe declarada, então fiquei meio confuso, mas se puderem continuar ajudando agradeço.
Abaixo esta os dois exemplos :
Imports System.IO
Public Class Form1
Dim x As New clsProcuraArquivos()
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim Parametro As String = ListBox1.Text
[ô]Dim Parametro As String = [Ô]teste.txt[Ô]
ListBox2.Items.Clear()
Dim query = From Arquivos In My.Computer.FileSystem.GetFiles(My.Computer.FileSystem.SpecialDirectories.MyDocuments) _
Where Arquivos.Contains(Parametro) _
Select Arquivos
For Each Item As String In query
ListBox2.Items.Add(Item)
Next
x.Search(dirs(i), word)
For Each f As System.IO.FileInfo In x.Files
MsgBox(f.FullName.ToString())
Next
End Sub
No aguardo de sua ajuda..
tem alguma coisa que nao esta funcionando , pois fiz alguns testes e da forma que esta, traz tudo que existe dentro da pasta , acho que o caminho deva ser esse mas posso estar fazendo alguma besteira !!
E tambem vou tentar explicar melhor o problema nao é com a extensao do arquivo e sim com seu nome em especifico , por exemplo : tenho dentro de um diretorio varias pastas e esses pastas tem seus nomes bem semelhantes, como por exemplo uma pasta com o nome A123456-H, outra pasta com o nome A1234567-J, outra pasta com o nome A1234570-0 e assim por diante, sendo assim existem uma centena de pastas semelhantes assim, então gostaria de fazer como se fosse a pesquisa do windows, em uma caixa de texto eu coloque por exemplo o texto A12345 e fosse feito um filtro e me mostrasse as pastas que iniciassem com essas iniciais.
No select do SQL se eu faço o filtro da tabela com nomes por exemplo, e quando digito a letra [Ô]A[Ô] a tabela ja filtra todos os nomes que iniciam com a letra [Ô]A[Ô] se continuar digitando por exemplo [Ô]Ar[Ô] a tabela já ira filtrar todos os nomes que iniciem com [Ô]Ar[Ô] e assim sucessivamente, não sei se piorei a explicacão ou ajudou em algo.
Alevale :
Acho que necessito fazer alguma referencia, pois esta dando erro e quando quero chamar a classe também esta dando erro.
normalmente faço referencia a classe e depois apenas digito a classe e passo os valores que estão entre parenteses para serem utilizados, mas no seu exemplo voce chama a classe depois chama outra referencia que não faz parte da classe declarada, então fiquei meio confuso, mas se puderem continuar ajudando agradeço.
Abaixo esta os dois exemplos :
Imports System.IO
Public Class Form1
Dim x As New clsProcuraArquivos()
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim Parametro As String = ListBox1.Text
[ô]Dim Parametro As String = [Ô]teste.txt[Ô]
ListBox2.Items.Clear()
Dim query = From Arquivos In My.Computer.FileSystem.GetFiles(My.Computer.FileSystem.SpecialDirectories.MyDocuments) _
Where Arquivos.Contains(Parametro) _
Select Arquivos
For Each Item As String In query
ListBox2.Items.Add(Item)
Next
x.Search(dirs(i), word)
For Each f As System.IO.FileInfo In x.Files
MsgBox(f.FullName.ToString())
Next
End Sub
No aguardo de sua ajuda..
Amigo, o que você quer fazer, basta entender caracteres curinga... é possÃvel fazer isso até mesmo com um arquivo BAT
Cara,
No meu exemplo, você precisa clicar em um item da ListBox1,
senão clicar em nenhum item, o programa vai, realmente, listar tudo quanto é arquivo.
No meu exemplo, você precisa clicar em um item da ListBox1,
senão clicar em nenhum item, o programa vai, realmente, listar tudo quanto é arquivo.
Tópico encerrado , respostas não são mais permitidas