Skip to main content
Engineering LibreTexts

2.2: Navigating a File System

  • Page ID
    43793
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Now let’s play with FileSystem.

    Immediate children. To list the immediate children of your working directory, execute the following expression:

    | working |
    working := FileSystem disk workingDirectory.
    working children.
        → anArray(File @ /Users/ducasse/Workspace/FirstCircle/Pharo/20/.DS_Store File
            @ /Users/ducasse/Workspace/FirstCircle/Pharo/20/ASAnimation.st ...) 
    

    Notice that children returns the direct files and folders. To recursively access all the children of the current directory you should use the message allChildren as follows:

    working allChildren.
    

    Converting a string character into a file reference is a common and handy operation. Simply send asFileReference to a string to get its corresponding file reference.

    '/Users/ducasse/Workspace/FirstCircle/Pharo/20' asFileReference
    

    Note that no error is raised if the string does not point to an existing file. You can however check whether the file exists or not:

    'foobarzork' asFileReference exists
        → false
    

    All '.st' files. Filtering is realized using standard pattern matching on file name. To find all st files in the working directory, simply execute:

    working allChildren select: [ :each | each basename endsWith: 'st' ]
    

    The basename message returns the name of the file from a full name (i.e., /foo/gloops.taz basename is 'gloops.taz').

    Accessing a given file or directory. Use the slash operator to obtain a reference to a specific file or directory within your working directory:

    | working cache |
    working := FileSystem disk workingDirectory.
    cache := working / 'package-cache'.
    

    Getting to the parent folder. Navigating back to the parent is easy using the parent message:

    | working cache |
    working := FileSystem disk workingDirectory.
    cache := working / 'package-cache'.
    parent := cache parent.
    parent = working
        → true
    

    Accessing directory properties. You can check the various properties of an element. For example, in the following we try with the cache directory by executing the following expressions:

    cache exists.                                        → true
    cache isSymLink. "ask if it is a symbolic link"      → false
    cache isFile.                                        → false
    cache isDirectory.                                   → true
    cache basename.                                      → 'package-cache'
    cache fullName
        → '/Users/ducasse/Workspace/FirstCircle/Pharo/20/package-cache'
    cache parent fullName
        → '/Users/ducasse/Workspace/FirstCircle/Pharo/20/'
    

    The methods exists, isFile, isDirectory, and basename are defined on the FileReference class. Notice that there is no message to get the path without the basename and that the idiom is to use parent fullName to obtain it. The message path returns a Path object which is internally used by FileSystem and is not meant to be publicly used.

    Note that FileSystem does not really distinguish between files and folders which often leads to cleaner code and can be seen as an application of the Composite design pattern.

    Querying file entry status. To get additional information about a filesystem entry, we should get an FileSystemDirectoryEntry using the message entry. Note that you can access the file permissions. Here are some examples:

    cache entry creation.                →    2012-04-25T15:11:36+02:00
    cache entry creationTime             →    2012-04-25T15:11:36+02:00
    cache entry creationSeconds          →    3512812296 2012-08-02T14:23:29+02:00
    cache entry modificationTime         →    2012-08-02T14:23:29+02:00
    cache entry size.                    →    0 (directories have size 0)
    cache entry permissions              →    rwxr-xr-x
    cache entry permissions class        →    FileSystemPermission
    cache entry permissions isWritable   →    true
    cache entry isFile                   →    false
    cache entry isDirectory              →    true
    

    Locations. The framework also supports locations, late-bound references that point to a file or directory. When asking to perform a concrete operation, a location behaves the same way as a reference. Here are some locations.

    FileLocator desktop.
    FileLocator home.
    FileLocator imageDirectory.
    FileLocator vmDirectory.
    

    If you save a location with your image and move the image to a different machine or operating system, a location will still resolve to the expected directory or file. Note that some file locations are specific to the virtual machine.


    This page titled 2.2: Navigating a File System is shared under a CC BY-SA 3.0 license and was authored, remixed, and/or curated by Alexandre Bergel, Damien Cassou, Stéphane Ducasse, Jannik Laval (Square Bracket Associates) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.