Home > Archive > Visual Basic > September 2004 > How can I search for files?
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
How can I search for files?
|
|
| Ed Landau 2004-09-04, 3:55 am |
| Using VB6, I'd like to do something like VBA's Application.fileSearch.
I'd like to say: Return a list of all files matching "*.xxx" and recursively
go thru all sub-directories. The FileListBox does not recursively go down
directories.
Any help would be appreciated.
The only way I can think is to have a hidden dirListBox and step thru it but
popping back up may be tricky.
Thanks
-Ed
| |
| Patty O'Dors 2004-09-04, 8:55 am |
| The quick way you can do it without writing an algorithm is to shell a
process that writes the data to a text file, but this is the only way you can
get the information.
e.g.
shell environ("comspec") & " dir ""c:\*.txt"" /b /s >thetextfiles.dat"
> Using VB6, I'd like to do something like VBA's Application.fileSearch.
> I'd like to say: Return a list of all files matching "*.xxx" and recursively
> go thru all sub-directories. The FileListBox does not recursively go down
> directories.
> Any help would be appreciated.
>
> The only way I can think is to have a hidden dirListBox and step thru it but
> popping back up may be tricky.
> Thanks
> -Ed
>
>
>
| |
| Don@home.com 2004-09-04, 8:55 am |
| On Sat, 4 Sep 2004 04:09:02 -0700, Patty O'Dors
<PattyODors@discussions.microsoft.com> wrote:
[color=darkred]
>The quick way you can do it without writing an algorithm is to shell a
>process that writes the data to a text file, but this is the only way you can
>get the information.
>e.g.
>shell environ("comspec") & " dir ""c:\*.txt"" /b /s >thetextfiles.dat"
>
>
>
Here is an API way of doing it... example from the API-Guide
Watch the Word Wrap...
'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4).
'Type in the first textbox a startingpath like c:\
'and in the second textbox you put a pattern like *.* or *.txt
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA"
(ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetFileAttributes Lib "kernel32" Alias
"GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As
Long
Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer,
DirCount As Integer)
'KPD-Team 1999
'E-Mail: KPDTeam@Allapi.net
'URL: http://www.allapi.net/
Dim FileName As String ' Walking filename variable...
Dim DirName As String ' SubDirectory Name
Dim dirNames() As String ' Buffer for directory name entries
Dim nDir As Integer ' Number of directories in this path
Dim i As Integer ' For-loop counter...
Dim hSearch As Long ' Search Handle
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
If Right(path, 1) <> "\" Then path = path & "\"
' Search for subdirectories.
nDir = 0
ReDim dirNames(nDir)
Cont = True
hSearch = FindFirstFile(path & "*", WFD)
If hSearch <> INVALID_HANDLE_VALUE Then
Do While Cont
DirName = StripNulls(WFD.cFileName)
' Ignore the current and encompassing directories.
If (DirName <> ".") And (DirName <> "..") Then
' Check for directory with bitwise comparison.
If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY
Then
dirNames(nDir) = DirName
DirCount = DirCount + 1
nDir = nDir + 1
ReDim Preserve dirNames(nDir)
End If
End If
Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
Loop
Cont = FindClose(hSearch)
End If
' Walk through this directory and sum file sizes.
hSearch = FindFirstFile(path & SearchStr, WFD)
Cont = True
If hSearch <> INVALID_HANDLE_VALUE Then
While Cont
FileName = StripNulls(WFD.cFileName)
If (FileName <> ".") And (FileName <> "..") Then
FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) +
WFD.nFileSizeLow
FileCount = FileCount + 1
List1.AddItem path & FileName
End If
Cont = FindNextFile(hSearch, WFD) ' Get next file
Wend
Cont = FindClose(hSearch)
End If
' If there are sub-directories...
If nDir > 0 Then
' Recursively walk into them...
For i = 0 To nDir - 1
FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\",
SearchStr, FileCount, DirCount)
Next i
End If
End Function
Sub Command1_Click()
Dim SearchPath As String, FindStr As String
Dim FileSize As Long
Dim NumFiles As Integer, NumDirs As Integer
Screen.MousePointer = vbHourglass
List1.Clear
SearchPath = Text1.Text
FindStr = Text2.Text
FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories"
Text4.Text = "Size of files found under " & SearchPath & " = " &
Format(FileSize, "#,###,###,##0") & " Bytes"
Screen.MousePointer = vbDefault
End Sub
Have a good day...
Don
| |
| Ed Landau 2004-09-04, 3:55 pm |
| Thanks much for both responses !!!
-Ed
<Don@home.com> wrote in message
news:p2cjj0h1c3q3f6a7j2h4ipdlaknpa82ov6@
4ax.com...
> On Sat, 4 Sep 2004 04:09:02 -0700, Patty O'Dors
> <PattyODors@discussions.microsoft.com> wrote:
>
can[color=darkred]
recursively[color=darkred]
down[color=darkred]
it but[color=darkred]
>
> Here is an API way of doing it... example from the API-Guide
> Watch the Word Wrap...
>
>
> 'Create a form with a command button (command1), a list box (list1)
> 'and four text boxes (text1, text2, text3 and text4).
> 'Type in the first textbox a startingpath like c:\
> 'and in the second textbox you put a pattern like *.* or *.txt
>
> Private Declare Function FindFirstFile Lib "kernel32" Alias
"FindFirstFileA"
> (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
> Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"
> (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
> Private Declare Function GetFileAttributes Lib "kernel32" Alias
> "GetFileAttributesA" (ByVal lpFileName As String) As Long
> Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As
Long) As
> Long
>
> Const MAX_PATH = 260
> Const MAXDWORD = &HFFFF
> Const INVALID_HANDLE_VALUE = -1
> Const FILE_ATTRIBUTE_ARCHIVE = &H20
> Const FILE_ATTRIBUTE_DIRECTORY = &H10
> Const FILE_ATTRIBUTE_HIDDEN = &H2
> Const FILE_ATTRIBUTE_NORMAL = &H80
> Const FILE_ATTRIBUTE_READONLY = &H1
> Const FILE_ATTRIBUTE_SYSTEM = &H4
> Const FILE_ATTRIBUTE_TEMPORARY = &H100
>
> Private Type FILETIME
> dwLowDateTime As Long
> dwHighDateTime As Long
> End Type
>
> Private Type WIN32_FIND_DATA
> dwFileAttributes As Long
> ftCreationTime As FILETIME
> ftLastAccessTime As FILETIME
> ftLastWriteTime As FILETIME
> nFileSizeHigh As Long
> nFileSizeLow As Long
> dwReserved0 As Long
> dwReserved1 As Long
> cFileName As String * MAX_PATH
> cAlternate As String * 14
> End Type
> Function StripNulls(OriginalStr As String) As String
> If (InStr(OriginalStr, Chr(0)) > 0) Then
> OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
> End If
> StripNulls = OriginalStr
> End Function
>
> Function FindFilesAPI(path As String, SearchStr As String, FileCount As
Integer,
> DirCount As Integer)
> 'KPD-Team 1999
> 'E-Mail: KPDTeam@Allapi.net
> 'URL: http://www.allapi.net/
>
> Dim FileName As String ' Walking filename variable...
> Dim DirName As String ' SubDirectory Name
> Dim dirNames() As String ' Buffer for directory name entries
> Dim nDir As Integer ' Number of directories in this path
> Dim i As Integer ' For-loop counter...
> Dim hSearch As Long ' Search Handle
> Dim WFD As WIN32_FIND_DATA
> Dim Cont As Integer
> If Right(path, 1) <> "\" Then path = path & "\"
> ' Search for subdirectories.
> nDir = 0
> ReDim dirNames(nDir)
> Cont = True
> hSearch = FindFirstFile(path & "*", WFD)
> If hSearch <> INVALID_HANDLE_VALUE Then
> Do While Cont
> DirName = StripNulls(WFD.cFileName)
> ' Ignore the current and encompassing directories.
> If (DirName <> ".") And (DirName <> "..") Then
> ' Check for directory with bitwise comparison.
> If GetFileAttributes(path & DirName) And
FILE_ATTRIBUTE_DIRECTORY
> Then
> dirNames(nDir) = DirName
> DirCount = DirCount + 1
> nDir = nDir + 1
> ReDim Preserve dirNames(nDir)
> End If
> End If
> Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
> Loop
> Cont = FindClose(hSearch)
> End If
> ' Walk through this directory and sum file sizes.
> hSearch = FindFirstFile(path & SearchStr, WFD)
> Cont = True
> If hSearch <> INVALID_HANDLE_VALUE Then
> While Cont
> FileName = StripNulls(WFD.cFileName)
> If (FileName <> ".") And (FileName <> "..") Then
> FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh *
MAXDWORD) +
> WFD.nFileSizeLow
> FileCount = FileCount + 1
> List1.AddItem path & FileName
> End If
> Cont = FindNextFile(hSearch, WFD) ' Get next file
> Wend
> Cont = FindClose(hSearch)
> End If
> ' If there are sub-directories...
> If nDir > 0 Then
> ' Recursively walk into them...
> For i = 0 To nDir - 1
> FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i)
& "\",
> SearchStr, FileCount, DirCount)
> Next i
> End If
> End Function
> Sub Command1_Click()
> Dim SearchPath As String, FindStr As String
> Dim FileSize As Long
> Dim NumFiles As Integer, NumDirs As Integer
> Screen.MousePointer = vbHourglass
> List1.Clear
> SearchPath = Text1.Text
> FindStr = Text2.Text
> FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
> Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & "
Directories"
> Text4.Text = "Size of files found under " & SearchPath & " = " &
> Format(FileSize, "#,###,###,##0") & " Bytes"
> Screen.MousePointer = vbDefault
> End Sub
>
> Have a good day...
>
> Don
| |
| Ed Landau 2004-09-04, 8:55 pm |
| Hi Patty: Somehow when I try to execute the Shell command, the arguments
don't seem to matter... I just get a command window appear but nothing gets
executed in it.
Any clues?
Thanks
-Ed
"Patty O'Dors" <PattyODors@discussions.microsoft.com> wrote in message
news:B6E23478-441A-41D4-8F4E-33A347630CC7@microsoft.com...
> The quick way you can do it without writing an algorithm is to shell a
> process that writes the data to a text file, but this is the only way you
can[color=darkred]
> get the information.
> e.g.
> shell environ("comspec") & " dir ""c:\*.txt"" /b /s >thetextfiles.dat"
>
>
>
recursively[color=darkred]
down[color=darkred]
but[color=darkred]
|
|
|
|
|