Bob Sneidar wrote:

Not to beat a severely wounded horse, but one reason for implementing
a detailed file function (and probably why it hasn't been tackled) is
that getting the detailed file information from a command shell is
decidedly  NOT straightforward.

Shell is great for things we can't do in LiveCode Script yet may not warrant writing special C-based API interfaces for in LC Builder.

But in addition to the complexity of attempting to rely on such interprocess communication across platforms, it also carries a certain impact on memory and performance.

"Why run one process when you can run two at twice the price!" :)

In the enhancement request I cited earlier:
https://quality.livecode.com/show_bug.cgi?id=20384

...Trevor raised a good point about instances where apparently macOS sometimes disallows access to a folder even while allowing access to specific files within it. It's hard for me to see how that would not be a configuration error on any other system, but I trust Apple has a good reason for that. And in such cases, we're hosed with any current LC Script solution that needs access to the whole folder's content.

But for the other 99.9% of cases, using a scripted handler reduces the task to a one-liner, here made even more convenient by allowing either the detailed info returned in its LC-native comma-delimited format or as an array if preferred:


on mouseUp
   put specialFolderPath("desktop")&"/test/Thisisafilename1000" into tPath
   put fwFileInfo( tPath, "Array") into tA
   if the result is not empty then
      answer the result
   else
      put the keys of tA
   end if
end mouseUp


function fwFileInfo pFile, pArrayFlag
   -- Returns info for the file specified in pFile.
   -- By default, returns the data in comma-delimited
   -- form in the order specified by "detailed files".
   -- With any value in the optional pArrayFlag arg
   -- it will return an array with descriptive keys.
   --
   if there is not a file pFile then
      return "No such file: "& pFile for error
   end if
   set the itemdel to "/"
   put urlEncode(last item of pFile) into tFileName
   put item 1 to -2 of pFile into tPath
   put files(tPath, "detailed") into tFiles
   if the result is not empty then
      return "Error getting file info: "& the result & \
            " ("&sysError()&")" for error
   end if
   put lineoffset(cr& tFileName&",", cr&tFiles) into tLineNum
   put line tLineNum of tFiles into tInfo
   if pArrayFlag is empty then
      return tInfo for value
   else
      set the itemdel to ","
      put 0 into i
put "name,size,resourceSize,dateCreated,dataModified,dateAccessed,"& \
            "dateBackedUp,owner,group,permissions,MacType" into tFields
      repeat for each item tItem in tInfo
         add 1 to i
         if i = 1 then put urlDecode(tItem) into tItem
         put tItem into tA[item i of tFields]
      end repeat
      return tA for value
   end if
end fwFileInfo


Performance isn't bad (times shown in ms on Ubuntu 14.04 with Ext4 file system) - each test was done with the slower form of the function call that uses the array option:

Folder with 20 files:     0.000072
Folder with 5,000 files:  0.024766
Folder with 10,000 files: 0.042299

I'll leave it as an exercise for the reader to compare with benchmarks for obtaining the same info via shell. But at a fraction of a millisecond with LC Script even in an insanely large directory, I'll wager the time to write the test would exceed any time saved over one's lifetime. :)

--
 Richard Gaskin
 Fourth World Systems
 Software Design and Development for the Desktop, Mobile, and the Web
 ____________________________________________________________________
 [email protected]                http://www.FourthWorld.com

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

Reply via email to