Has Anyone Got A Directory "Walker" Available

Ali Lloyd ali.lloyd at livecode.com
Sat Apr 21 04:14:00 EDT 2018


Now that we have files(pFolder), folder(pFolder) (and files(pFolder,
"detailed"), folders(pFolder, "detailed")), directory walking code can be
improved somewhat by not having to set the current folder.

Actually, I haven't checked what happens when you get
files(pRestrictedFolder)

On Fri, Apr 20, 2018 at 7:49 PM Richard Gaskin via use-livecode <
use-livecode at lists.runrev.com> wrote:

> You may recall the dreaded recursion errors that have cropped up in
> discussions of directory walkers.  They happen not because anyone has
> directory trees > 40,000 folders deep, but because a permissions
> restriction can prevent going into a subdirectory, causing the current
> directory to be traversed again and again until the recursion error is
> thrown.
>
> The way to avoid this is to add an error check when setting the
> directory, e.g.:
>
>   set the directory to pFolder
>   if the result is not empty then
>     -- skip or report as needed
>   end if
>
>
> --
>   Richard Gaskin
>   Fourth World Systems
>
>
> Sannyasin Brahmanathaswami wrote:
>
>  >  I found this in a toolbox. Sent by some ago, by a LiveCode deva
>  >
>  > For what it's worth :
>  >
>  > # Filters the strings "." and ".." from a list
>  > function filterDots pList
>  >    local tList
>  >
>  >    put pList into tList
>  >    filter tList without "."
>  >    filter tList without ".."
>  >
>  >    return tList
>  > end filterDots
>  > # Returns a filtered list of files in the current directory
>  > function filteredFiles
>  >    return filterDots(the files)
>  > end filteredFiles
>  >
>  > # Returns a filtered list of folders in the current directory
>  > function filteredFolders
>  >    return filterDots(the folders)
>  > end filteredFolders
>  >
>  > # Returns a list of files in the current directory including
>  > # each file's full path.
>  > function filteredFilesWithPaths
>  >    local tFiles, tFilesWithPaths
>  >
>  >    put filteredFiles() into tFiles
>  >    repeat for each line tFile in tFiles
>  >       put the directory & slash & tFile & return after \
>  >             tFilesWithPaths
>  >    end repeat
>  >    delete the last char of tFilesWithPaths
>  >
>  >    return tFilesWithPaths
>  > end filteredFilesWithPaths
>  >
>  >
>  > # Returns a list of files in a given folder, using recursion to
>  > # include files in subfolders if desired.
>  > function listFiles pFolder, pRecurse
>  >    local tTotalFiles, tCurrentFiles, tFolders
>  >
>  > set the directory to pFolder
>  >    put filteredFiles() into tCurrentFiles
>  >    if not pRecurse then return tCurrentFiles
>  >    if tCurrentFiles is not empty then
>  >       put tCurrentFiles & return after tTotalFiles
>  >    end if
>  >    put filteredFolders() into tFolders
>  >
>  > repeat for each line tFolder in tFolders
>  >       put listFiles((pFolder & slash & tFolder), pRecurse) into \
>  >       tCurrentFiles
>  >       if tCurrentFiles is not empty then
>  >          put tCurrentFiles & return after tTotalFiles
>  >       end if
>  >    end repeat
>  > delete the last char of tTotalFiles
>  >
>  >    return tTotalFiles
>  > end listFiles
>  >
>  > # Returns a list of files with their containing folders, using
>  > # recursion
>  > # if desired to descend into sub folders.
>  > function listFilesWithFolders pFolder, pRecurse
>  >    local tTotalFiles, tCurrentFiles, tFolders
>  >
>  > set the directory to pFolder
>  >    put filteredFiles() into tCurrentFiles
>  >    if not pRecurse then return pFolder & return & "--" & return \
>  >    & tCurrentFiles
>  >    if tCurrentFiles is not empty then
>  > put pFolder & return & "--" & return after tTotalFiles
>  >       put tCurrentFiles & return & return after tTotalFiles
>  >    end if
>  > put filteredFolders() into tFolders
>  >    repeat for each line tFolder in tFolders
>  >       put listFilesWithFolders((pFolder & slash & tFolder), \
>  >       pRecurse) into tCurrentFiles
>  >       if tCurrentFiles is not empty then put tCurrentFiles & \
>  >       return after tTotalFiles
>  > end repeat
>  >    delete the last char of tTotalFiles
>  >
>  >    return tTotalFiles
>  > end listFilesWithFolders
>  >
>  > # Returns a list of files with the full paths
>  > function listFilesWithPaths pFolder, pRecurse
>  >    local tTotalFiles, tCurrentFiles, tFolders
>  >
>  >    set the directory to pFolder
>  >    put filteredFilesWithPaths() into tCurrentFiles
>  >    if not pRecurse then return tCurrentFiles
>  > if tCurrentFiles is not empty then put tCurrentFiles & \
>  >    return after tTotalFiles
>  >    put filteredFolders() into tFolders
>  >    repeat for each line tFolder in tFolders
>  >       put listFilesWithPaths((pFolder & slash & tFolder), \
>  >  pRecurse) into tCurrentFiles
>  >       if tCurrentFiles is not empty then put tCurrentFiles & \
>  >       return after tTotalFiles
>  > end repeat
>  >    delete the last char of tTotalFiles
>  >
>  >    return tTotalFiles
>  > end listFilesWithPaths
>  >
>  > # Returns a sorted list of the files in pFolder. Again using
>  > # recursion if
>  > # required.
>  > function listSortedFiles pFolder, pRecurse
>  >    local tFiles
>  >
>  >    put listFiles(pFolder, pRecurse) into tFiles
>  >    sort lines of tFiles by listSortedFilesSortKey(each)
>  >
>  >    return tFiles
>  > end listSortedFiles
>  >
>  > # Used by the listSortedFiles() function. Returns a sort key
>  > # from each file's name to
>  > # allow the sorting to be fully customized.
>  > function listSortedFilesSortKey pFile
>  >    # Use this value for a normal text sort
>  >    return pFile
>  > end listSortedFilesSortKey
>  >
>  >
>  > on doSomething pFile
>  >    put pFile & return after msg
>  > end doSomething
>  >
>  > --This will achieve similar results to listing the files except that
>  > it will be slower because text has to be drawn to the screen at each
>  > iteration.
>  >
>  > # Use this template function to perform an action on each file
>  > # in a folder
>  > on doForEachFile pFolder, pRecurse
>  >    set the directory to pFolder
>  >    repeat for each line tFile in filteredFiles()
>  >       doSomething (pFolder & slash & tFile)
>  >    end repeat
>  >    if pRecurse then
>  >       repeat for each line tFolder in filteredFolders()
>  >          doForEachFile (pFolder & slash & tFolder), pRecurse
>  >       end repeat
>  >    end if
>  > end doForEachFile
>  >
>  >
>  >
>  >     I have directory available this days of Ken Ray, in the on system
>  > of set the default folder and get the the files, registered that path.
>  > descend recursively to the level… etc.
>  >
>  >     Do anyone has a new one handy they could share using the folder
>  > and file function?
>  >
>  >     BR
>  >
>
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode



More information about the use-livecode mailing list