Directory Reading 
	 
	
		| Author | 
		Message | 
	 
		 
		srbman
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 11:11 am    Post subject: Directory Reading  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| I was wondering if anyone knew a way to read all the file names in a given directory and copy them into a text file. I would prefer the code in any of the following: Flash AS1.x or 2.x, Visual Basic 6.x, or Turing if possible. Thanx | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		GlobeTrotter
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 11:24 am    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Here's a module I wrote in vb6 (with the help of some tutorials on some Win32 functions) that takes in a directory as an arguments, as well as whether or not it should check sub-folders as well.  If it should check sub-folders, it recursively searches those folders for files or folders.  It is not perfect, unfortunately, and probably could be optimized quite a deal.  But still, it works for me.
 
 
This is the primary module:
 
	  | code: | 	 		  
 
Option Explicit
 
 
Public Const MAX_PATH = 260
 
Private Const ERROR_NO_MORE_FILES = 18
 
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
 
Private Const FILE_ATTRIBUTE_NORMAL = &H80
 
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
 
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
 
Private 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
 
 
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" _
 
    (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
 
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
 
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _
 
    (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
 
 
Private Function StripTerminator(ByVal strString As String) As String
 
    Dim intZeroPos As Integer
 
    intZeroPos = InStr(strString, Chr$(0))
 
    If intZeroPos > 0 Then
 
        StripTerminator = Left$(strString, intZeroPos - 1)
 
    Else
 
        StripTerminator = strString
 
    End If
 
End Function
 
 
Private Function ListFilesNoDepth(ByVal sStartDir As String) As String()
 
    Dim strFileArray() As String
 
 
    Dim lpFindFileData As WIN32_FIND_DATA, lFileHdl  As Long
 
    Dim sTemp As String, sTemp2 As String, lRet As Long, iLastIndex  As Integer
 
    Dim strPath As String
 
    
 
    On Error Resume Next
 
    
 
    '// add trailing \ to start directory if required
 
    If Right$(sStartDir, 1) <> "\" Then sStartDir = sStartDir & "\"
 
 
    sStartDir = sStartDir & "*.*"
 
    
 
    '// get a file handle
 
    lFileHdl = FindFirstFile(sStartDir, lpFindFileData)
 
    
 
    If lFileHdl <> -1 Then
 
        Do Until lRet = ERROR_NO_MORE_FILES
 
            strPath = Left$(sStartDir, Len(sStartDir) - 4) & "\"
 
 
            '// if it is a file
 
            If (lpFindFileData.dwFileAttributes And vbDirectory) <> FILE_ATTRIBUTE_DIRECTORY Then
 
                sTemp = StrConv(Left$(sStartDir, Len(sStartDir) - 3) & StripTerminator(lpFindFileData.cFileName), vbLowerCase)
 
                Call strArrayAdd(strFileArray, sTemp)
 
 
            End If
 
            '// based on the file handle iterate through all files and dirs
 
            lRet = FindNextFile(lFileHdl, lpFindFileData)
 
            If lRet = 0 Then Exit Do
 
        Loop
 
    End If
 
    '// close the file handle
 
    lRet = FindClose(lFileHdl)
 
    
 
    ListFilesNoDepth = strFileArray
 
End Function
 
 
 
Private Function ListDirsNoDepth(ByVal sStartDir As String) As String()
 
    Dim strFolderArray() As String
 
 
    Dim lpFindFileData As WIN32_FIND_DATA, lFileHdl  As Long
 
    Dim sTemp As String, sTemp2 As String, lRet As Long, iLastIndex  As Integer
 
    Dim strPath As String
 
    
 
    On Error Resume Next
 
    
 
    '// add trailing \ to start directory if required
 
    If Right$(sStartDir, 1) <> "\" Then sStartDir = sStartDir & "\"
 
 
    sStartDir = sStartDir & "*.*"
 
    
 
    '// get a file handle
 
    lFileHdl = FindFirstFile(sStartDir, lpFindFileData)
 
    
 
    If lFileHdl <> -1 Then
 
        Do Until lRet = ERROR_NO_MORE_FILES
 
            strPath = Left$(sStartDir, Len(sStartDir) - 4) & "\"
 
            '// if it is a directory
 
            If (lpFindFileData.dwFileAttributes And vbDirectory) = FILE_ATTRIBUTE_DIRECTORY Then
 
                'Strip off null chars and format the string
 
                sTemp = StrConv(Left$(sStartDir, Len(sStartDir) - 3) & StripTerminator(lpFindFileData.cFileName), vbLowerCase)
 
                ' make sure it is not a reference
 
                If InStr(sTemp, ".") = 0 Then
 
                    'add it to the tree view. Store its path as its Key
 
                    Call strArrayAdd(strFolderArray, sTemp)
 
                End If
 
            End If
 
            '// based on the file handle iterate through all files and dirs
 
            lRet = FindNextFile(lFileHdl, lpFindFileData)
 
            If lRet = 0 Then Exit Do
 
        Loop
 
    End If
 
    '// close the file handle
 
    lRet = FindClose(lFileHdl)
 
    
 
    ListDirsNoDepth = strFolderArray
 
End Function
 
 
Public Function ListFiles(ByVal strStartDir As String, boDepth As Boolean) As String()
 
    Dim strFiles() As String
 
    Dim strDirs() As String
 
    Dim lCount As Long
 
    
 
    If Not boDepth Then
 
        strFiles = ListFilesNoDepth(strStartDir)
 
    Else
 
        strDirs = ListDirsNoDepth(strStartDir)
 
        If strFixedUBound(strDirs) = -1 Then
 
            strFiles = ListFilesNoDepth(strStartDir)
 
        Else
 
            For lCount = 0 To strFixedUBound(strDirs)
 
                Call strArrayAddArray(strFiles, ListFilesNoDepth(strDirs(lCount)))
 
                Call strArrayAddArray(strFiles, ListFiles(strDirs(lCount), boDepth))
 
            Next lCount
 
        End If
 
    End If
 
    
 
    ListFiles = strFiles
 
End Function
 
 
Public Function ListDirs(ByVal strStartDir As String, boDepth As Boolean) As String()
 
    Dim strDirs() As String
 
    Dim lCount As Long
 
    
 
    If Not boDepth Then
 
        strDirs = ListDirsNoDepth(strStartDir)
 
    Else
 
        strDirs = ListDirsNoDepth(strStartDir)
 
        For lCount = 0 To strFixedUBound(strDirs)
 
            Call strArrayAddArray(strDirs, ListDirs(strDirs(lCount), boDepth))
 
        Next lCount
 
    End If
 
    
 
    ListDirs = strDirs
 
End Function
 
  | 	  
 
 
You may also need these secondary functions/procedures
 
 
	  | code: | 	 		  
 
Public Function strArrayRemoveDupes(strArray() As String) As String()
 
    Dim ArrResult() As String
 
    Dim lCount1 As Long
 
    Dim lCount2 As Long
 
    
 
    Dim tempBool As Boolean
 
    
 
    For lCount1 = 0 To strFixedUBound(strArray)
 
        tempBool = True
 
        For lCount2 = lCount1 To strFixedUBound(strArray)
 
            If lCount1 <> lCount2 And strArray(lCount1) = strArray(lCount2) Then
 
                tempBool = False
 
            End If
 
        Next lCount2
 
        
 
        If tempBool Then
 
            Call strArrayAdd(ArrResult, strArray(lCount1))
 
        End If
 
    Next lCount1
 
    
 
    strArrayRemoveDupes = ArrResult
 
End Function
 
 
Public Sub WriteFile(LineArray() As String, strFileName As String)
 
    Dim FileNum As Integer
 
    Dim lCount As Long
 
    
 
    FileNum = FreeFile
 
    Open strFileName For Output As FileNum
 
    
 
    If Not isStringArrayEmpty(LineArray) Then
 
        For lCount = 0 To UBound(LineArray)
 
            Print #FileNum, LineArray(lCount)
 
        Next lCount
 
    End If
 
    Close #FileNum
 
End Sub
 
  | 	  
 
 
To call it, you would go like this:
 
	  | code: | 	 		  
 
Call WriteFile(strArrayRemoveDupes(ListFiles("C:/SEARCH_DIRECTORY",False)),"C:/OUTPUT_FILE.TXT")
 
  | 	  
 
 
When I talked about it not being perfect, I was primarily referring to the need to use the RemoveDupes function.  For some reason, which I can't figure out, my ListFiles function will sometimes output duplicate filenames.  But I employed a quick fix, and it shouldn't do that anymore. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		srbman
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 11:57 am    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| your code works until it gets to strFixedUBound and then it says "sub or fucntion not defined" i put the module code in "module1" the secondary procedures in "form1" called everything in a button on form1 do i need to add or change anything to make it work? (i changed the target directory to a directory on my computer) | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		GlobeTrotter
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 2:05 pm    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Oh, my bad.  Also include these small functions: 
 
 
	  | code: | 	 		  
 
Public Function isStringArrayEmpty(StringArray() As String) As Boolean
 
    Dim lTemp As Long
 
    On Error Resume Next
 
    lTemp = UBound(StringArray)
 
    isStringArrayEmpty = (Err.Number <> 0)
 
End Function
 
 
Public Function strFixedUBound(StringArray() As String) As Long
 
    If isStringArrayEmpty(StringArray) Then
 
        strFixedUBound = -1
 
    Else
 
        strFixedUBound = UBound(StringArray)
 
    End If
 
End Function
 
  | 	  
 
 
strFixedUBound just returns the upper bound of an array (almost identical to UBound) except it returns -1 if the array is empty.
 
 
You also will probably need these functions too:
 
 
	  | code: | 	 		  
 
Public Sub strArrayAdd(ByRef strArray() As String, strAdd As String)
 
    If isStringArrayEmpty(strArray) Then
 
        ReDim strArray(0)
 
        strArray(0) = strAdd
 
    Else
 
        ReDim Preserve strArray(UBound(strArray) + 1)
 
        strArray(UBound(strArray)) = strAdd
 
    End If
 
End Sub
 
 
Public Sub strArrayAddArray(ByRef strArray() As String, strAddArray() As String)
 
    Dim lCount As Long
 
    If isStringArrayEmpty(strArray) Then
 
        strArray = strAddArray
 
    Else
 
        For lCount = 0 To strFixedUBound(strAddArray)
 
            ReDim Preserve strArray(strFixedUBound(strArray) + 1)
 
            strArray(UBound(strArray)) = strAddArray(lCount)
 
        Next lCount
 
    End If
 
End Sub
 
  | 	  
 
 
It should work now, sorry.  Let me know if it works. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		srbman
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 2:47 pm    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				thanx it works, is there a way to get rid of the album art jpegs that it gives in a music folder? (for example albumart_{f52fbda5-47e8-4d41-aa76-9bd0b3b11ebb}_large.jpg )
 
 
thanx again | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		GlobeTrotter
 
 
 
    
		 | 
		
		
			
				  Posted: Sun Apr 30, 2006 4:52 pm    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				You could always write a function that loops through each file and checks if the filetype is ".mp3", and if the filetype isn't mp3, remove it.  It would not be at all difficult.  Here are some functions I've already made that may be useful for this:
 
 
	  | code: | 	 		  
 
Public Function ExtractFileType(ByVal strPath As String) As String
 
    Dim strResult As String
 
    Dim lDotLocation As Long
 
    
 
    If Len(strPath) > 0 Then
 
        lDotLocation = InStrRev(strPath, ".")
 
        If lDotLocation > 0 Then
 
            strResult = Mid(strPath, lDotLocation + 1)
 
        End If
 
    End If
 
    
 
    ExtractFileType = strResult
 
End Function
 
 
Public Function ExtractFileName(ByVal strPath As String) As String
 
    Dim strResult As String
 
    Dim lDotLocation As Long
 
    Dim lSlashLocation As Long
 
    
 
    If Len(strPath) > 0 Then
 
        lDotLocation = InStrRev(strPath, ".")
 
        lSlashLocation = InStrRev(strPath, "\")
 
        If lDotLocation > 0 Then
 
            strResult = Mid(strPath, lSlashLocation + 1, lDotLocation - lSlashLocation - 1)
 
        Else
 
            strResult = Mid(strPath, lSlashLocation + 1)
 
        End If
 
    End If
 
    
 
    ExtractFileName = strResult
 
End Function
 
 
Public Function ExtractFolder(ByVal strPath As String) As String
 
    Dim strResult As String
 
    Dim lSlashLocation As Long
 
    Dim lDotLocation As Long
 
    
 
    strResult = ReplaceInString(strPath, "/", "\")
 
    lSlashLocation = InStrRev(strResult, "\")
 
    lDotLocation = InStrRev(strResult, ".")
 
    
 
    If lSlashLocation > 0 Then
 
        If lDotLocation > 0 Then
 
            strResult = Left$(strResult, lSlashLocation)
 
        End If
 
        
 
        If Right$(strResult, 1) = "\" Then
 
            strResult = Left$(strResult, Len(strResult) - 1)
 
        End If
 
        
 
        lSlashLocation = InStrRev(strResult, "\")
 
        
 
        strResult = Mid(strResult, lSlashLocation + 1)
 
    End If
 
    
 
    ExtractFolder = strResult
 
End Function
 
  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		srbman
 
 
 
    
		 | 
		
		
			
				  Posted: Mon May 01, 2006 7:09 pm    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| thanx ill try working on it next weekend when i have more time. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Andy
 
 
 
    
		 | 
		
		
			
				  Posted: Tue May 02, 2006 12:27 pm    Post subject: (No subject)  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				use system call "dir > blah.txt" then parse it    | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |