LOCALIZAR ARQUIVOS !!

ARTUR 28/08/2012 20:25:06
#408800
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á.
KERPLUNK 29/08/2012 09:00:26
#408820
Já ouviu falar nos caracteres curinga?
PEGUDO 29/08/2012 09:06:21
#408821
Resposta escolhida
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:

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
ALEVALE 29/08/2012 09:08:06
#408823
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.
ARTUR 29/08/2012 20:06:27
#408880
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..
KERPLUNK 30/08/2012 09:15:24
#408924
Amigo, o que você quer fazer, basta entender caracteres curinga... é possível fazer isso até mesmo com um arquivo BAT
PEGUDO 31/08/2012 12:25:06
#409008
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.
Tópico encerrado , respostas não são mais permitidas