How do I check if a file or directory exists in EK9?

← File I/O · Ref: Q153

EK9 provides the FileSystemPath type for working with file system paths. It supports checking existence, distinguishing files from directories, and performing path operations.

FILESYSTEMPATH TYPE

Create a FileSystemPath from a string:

  path <- FileSystemPath("/home/user/data.txt")

FileSystemPath represents a location on the file system without opening or reading the file.

CHECKING EXISTENCE

Use exists() to check if the path points to something on disk:

  if path.exists()
    stdout.println("Path exists")

The exists() method returns a Boolean that is set to true or false.

FILE VS DIRECTORY

Distinguish between files and directories:

  if path.isFile()
    stdout.println("It is a file")
  else if path.isDirectory()
    stdout.println("It is a directory")

You can also check isReadable(), isWritable(), and isExecutable().

PATH OPERATIONS

FileSystemPath supports several path manipulation methods:

  abs <- path.absolutePath()
  name <- path.fileName()
  parent <- path.parent()
  joined <- path + "subdir"

Use startsWith() and endsWith() for prefix and suffix checks.

See Q42 for the Path type. See Q151 for reading files. See Q152 for writing files.

Example

defines module qa.fileio.path

  defines program

    FilePathExistsDemo()
      stdout <- Stdout()

      // === CREATING FILESYSTEMPATH ===

      path <- FileSystemPath("/tmp")
      stdout.println("Path: " + $path)

      // === CHECKING EXISTENCE ===

      stdout.println("Exists: " + $path.exists())

      // === FILE VS DIRECTORY ===

      stdout.println("Is file: " + $path.isFile())
      stdout.println("Is directory: " + $path.isDirectory())

      // === PATH PROPERTIES ===

      stdout.println("Is readable: " + $path.isReadable())
      stdout.println("Is writable: " + $path.isWritable())
      stdout.println("Is absolute: " + $path.isAbsolute())

      // === PATH OPERATIONS ===

      absolutePath <- path.absolutePath()
      stdout.println("Absolute: " + $absolutePath)

      // Path concatenation with + operator
      subPath <- path + "subdir"
      stdout.println("Sub path: " + $subPath)

Common mistakes

E50060 — FileSystemPath constructor expects a String argument. Passing an Integer triggers E50060 — constructor not resolved because no FileSystemPath(Integer) exists. File paths are always represented as strings in EK9. See ek9 -h E50060 for details.

Incorrect:

path <- FileSystemPath(42)

Correct:

path <- FileSystemPath("/tmp")

E50060 — FileSystemPath has no fileExists() method. Use exists() to check if the path points to something on disk. See ek9 -h E50060 for details.

Incorrect:

stdout.println("Exists: " + $path.fileExists())

Correct:

stdout.println("Exists: " + $path.exists())

E50060 — FileSystemPath has no getAbsolutePath() method. Use absolutePath() to get the absolute path. EK9 uses descriptive method names rather than Java-style getters. See ek9 -h E50060 for details.

Incorrect:

absolutePath <- path.getAbsolutePath()

Correct:

absolutePath <- path.absolutePath()
Other ways to ask this
  • How do I use FileSystemPath in EK9?
  • How do I check if a path exists in EK9?
  • How do I work with file paths in EK9?

Coming from another language?

Java: Files.exists(Path) and Path for path operations. Python: os.path.exists() or pathlib.Path. Rust: Path::exists() and std::path::Path. Go: os.Stat() for existence checks. EK9: FileSystemPath('/path') with exists(), isFile(), isDirectory() methods and + operator for path joining.

Keywords: filesystem, isDirectory, directory, file, write, exists, folder, check, isFile, read, path