directory tree -> array
alex at tweedly.net
Tue Feb 4 20:53:37 EST 2020
On 04/02/2020 17:20, Bob Sneidar via use-livecode wrote:
> Good points. I'll make some changes and resubmit. It never dawned on me that someone would intentionally send an empty path, but it *might* happen accidentally. Also, a path like /Users/BobSneidar being repeated would be very edge case, and as an IT guy I would probably take the computer away from any user that managed to make that happen, but it *could* happen and it's always a good idea to guard against such things.
There should be a "basic competency test" - if you pass, you get to have
a computer; if not, you're limited to an iPad :-)
Although "/Users/BobSneidar" is an extremely unlikely case, maybe "/tmp"
or "/Users" are example where there is a greater danger the string
occurring within the sub-folder names.
If you're going to resubmit to the Master Library, then I have one more
suggestion (though I realize that it may be ruled out for backwards
compatibility). Your function is called 'directorylisting', but it
actually returns a list of files; maybe it could have its name changed
to 'filelisting', and a 'directorylisting' function added ?
P.S. Here's my version, called folderListing.
1. it is non-recursive - in general iteration is faster than recursion.
2. like Ben's recursive version, it allows for easy suppression of
"dot-folders", but I made that a parameter of the function
3. it puts newly found directories at the start of the list, rather than
the end, so that it will get exactly the same result (i.e. in the same
order) as the straightforward recursive method (i.e. depth-first). Just
adding them at the end would have been marginally more efficient, and
noticeably simpler in code - but it's a price worth paying for
function folderListing pFolder, pIgnoreDotFolders
local tFolders, tAllFolders
if pIgnoreDotFolders is empty then -- ignore them by default (Unix
put TRUE into pIgnoreDotFolders
put the defaultfolder into tOriginalFolder
local tAbsFolder, tFoldersLeft, tSub, tFoldersHere
set the defaultfolder to pFolder
put the defaultfolder into tAbsFolder -- changes relative into
put CR into tFoldersLeft
repeat until tFoldersLeft is empty
put line 1 of tFoldersLeft into tSub
set the defaultFolder to (tAbsFolder & tSub)
if the result is not empty then
-- skip or report as needed
put (tAbsFolder & tSub) &CR after tAllFolders
put folders() into tFolders
delete line 1 of tFolders -- delete ".."
if pIgnoreDotFolders then
filter tFolders without ".*"
if tFolders is empty then
delete line 1 of tFoldersLeft
put empty into tFoldersHere
repeat for each line L in tFolders
put tSub & "/" & L & CR after tFoldersHere
put char 1 to -2 of tFoldersHere into line 1 of tFoldersLeft
set the defaultfolder to tOriginalFolder
More information about the use-livecode