Managing Files and Directories
The DirectoryInfo class in System.IO is useful for getting information about files and directories and to deal with them: rename, move to, delete, create...
Here you see a sample function which should run on any system with Dyalog Version 11 and at least .NET 1.1
System∆IO∆DirectoryInfo;⎕ML;⎕IO;directory;myDirObj;listOfFiles;subdir;subdirObj;di;successFlag
⍝ Version 1.3 from 2006-12-22 ⋄ Kai Jaeger ⋄ APL Team Ltd
⎕ML ⎕IO←1
⎕USING,←⊂''
⍝ The directory we want deal with:
directory←2 ⎕NQ'.' 'GetEnvironment' 'Dyalog'
⍝ Establish a .NET object reference on this:
myDirObj←⎕NEW System.IO.DirectoryInfo(⊂directory) ⍝ Version 11: enclose argument!
⍝ Get a list of all files in that directory:
⎕←listOfFiles←myDirObj.GetFiles ⍬ ⍝ it's a method: needs an argument!
⍝ Make simple strings from the result and display as a simple matrix:
⍝ Note that listOfFiles is _not_ a vector of string but an array of objects.
⍝ Therefore, we have to ⍕¨ them to get a string for every object. This works
⎕←↑⍕¨listOfFiles
⍝ Note that ⍕¨ is the same as this:
listOfFiles.ToString
⍝ Get the LastWriteTime for all files in that directory:
⎕←listOfFiles.LastWriteTime
⍝ The same with a different technique:
⎕←myDirObj.(GetFiles ⍬).LastWriteTime
⍝ The same but with UTC time instead:
myDirObj.(GetFiles ⍬).LastWriteTimeUtc
⍝ Check existence:
⎕←'Does not exist!' 'Exists'⊃⍨1+{⍵.Exists}⎕NEW System.IO.DirectoryInfo(⊂directory)
⎕←'Does not exist!' 'Exists'⊃⍨1+{⍵.Exists}⎕NEW System.IO.DirectoryInfo(⊂'Does HopefullyNotExist')
⎕←myDirObj.Parent ⍝ No argument ...
⎕←myDirObj.Root ⍝ ... because these ...
⎕←myDirObj.Name ⍝ ... area all ...
⎕←myDirObj.FullName ⍝ ... properties
⍝ Use a search pattern:
⎕←myDirObj.GetFiles(⊂'*.exe')
⍝ Possible also for sub-directories:
⎕←myDirObj.GetDirectories ⍬
⍝ And this in turn is possible with search patterns as well:
⎕←myDirObj.GetDirectories⊂'apl*'
⍝ Create a new sub-directory
subdir←14 0⍕100⊥¯1↓⎕TS
subdirObj←myDirObj.CreateSubdirectory⊂subdir
⍝ Create many levels of sub-dirs in one go:
{}myDirObj.CreateSubdirectory(⊂subdir,'\abc\de\fgh\xyz')
⍝ Get sub-directories of this:
⎕←subdirObj.GetDirectories ⍬
⍝ Rename a file or directory (or move it):
⍝ For this, we need an instance of the "DirectoryEntry" class pointing
⍝ to the parent of the directory we want rename
di←⎕NEW System.IO.DirectoryInfo(⊂directory,subdir)
di.MoveTo(⊂directory,(¯1↓subdir),'_',⎕AN)
⍝ The same with a slightly different technique; ⍺=old name, ⍵=new name
(directory,(¯1↓subdir),'_',⎕AN){(⎕NEW System.IO.DirectoryInfo(⊂⍺)).MoveTo⊂⍵}directory,(¯1↓subdir),'___',⎕AN
⍝ Re-establish reference for next and final setp:
subdirObj←⎕NEW System.IO.DirectoryInfo(⊂directory,(¯1↓subdir),'___',⎕AN)
⍝ Delete the newly introduced sub-dir:
{0::⎕EXCEPTION ⋄ subdirObj.Delete ⍵}⍬ ⍝ fails because not empty!
⍝ Delete the newly introduced sub-dir along with all the sub-dirs:
⍝ Before executing this line, start Windows Explorer and look into
⍝ that directory. As long as the Windows Explorer is looking into the
⍝ directory, it cannot be deleted. You will therefore get an Exception:
successFlag←0
:Repeat
:Trap 90
subdirObj.Delete 1
successFlag←1
:Else
⎕←'Delete directory has failed; to try again press <Enter>' ⋄ {}⍞
:EndTrap
:Until successFlag
⍝ EndNice and easy to use. However, if you need to deal with large numbers of files, watch out! When I tried to deal with 90,000 files the other day, these methods proved to be inadequate. For this, look at the WinFile class.
Author: KaiJaeger
APL Wiki