Differences between revisions 8 and 9
Revision 8 as of 2008-03-01 07:11:05
Size: 3904
Editor: KaiJaeger
Comment:
Revision 9 as of 2008-06-03 17:12:44
Size: 4128
Editor: KaiJaeger
Comment: Word of warning added
Deletions are marked like this. Additions are marked like this.
Line 99: Line 99:
Nice 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.

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

⍝ End

Nice 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: Kai Jaeger


CategoryDyalogExamplesDotNet CategoryDotNet

DirectoryInfo (last edited 2015-04-05 01:18:35 by PierreGilbert)