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.

Absolutely :-)

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 ?

-- Alex.

P.S. Here's my version, called folderListing.

NB

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 equivalency testing.


function folderListing pFolder, pIgnoreDotFolders
   local tFolders, tAllFolders
   local tOriginalFolder
   if pIgnoreDotFolders is empty then -- ignore them by default (Unix convention)
      put TRUE into pIgnoreDotFolders
   end if

   put the defaultfolder into tOriginalFolder

   local tAbsFolder, tFoldersLeft, tSub, tFoldersHere
   set the defaultfolder to pFolder
   put the defaultfolder into tAbsFolder   -- changes relative into absolute

   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
         next repeat
      end if
      put (tAbsFolder & tSub)  &CR after tAllFolders
      try
         put folders() into tFolders
      end try
      delete line 1 of tFolders   -- delete ".."
      if pIgnoreDotFolders then
         filter tFolders without ".*"
      end if
      if tFolders is empty then
         delete line 1 of tFoldersLeft
      else
         put empty into tFoldersHere
         repeat for each line L in tFolders
            put tSub & "/" & L & CR after tFoldersHere
         end repeat
         put char 1 to -2 of tFoldersHere into line 1 of tFoldersLeft
      end if
   end repeat
   set the defaultfolder to tOriginalFolder
   return tAllFolders
end folderListing




_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to