Swiftpack.co - Package - JohnSundell/Files


BuddyBuild CocoaPods Carthage Swift Package Manager Twitter: @johnsundell

Welcome to Files, a compact library that provides a nicer way to handle files and folders in Swift. It’s primarily aimed at Swift scripting and tooling, but can also be embedded in applications that need to access the file system. It's essentially a thin wrapper around the FileManager APIs that Foundation provides.


  • [X] Modern, object-oriented API for accessing, reading and writing files & folders.
  • [X] Unified, simple do, try, catch error handling.
  • [X] Easily construct recursive and flat sequences of files and folders.


Iterate over the files contained in a folder:

for file in try Folder(path: "MyFolder").files {

Rename all files contained in a folder:

try Folder(path: "MyFolder").files.enumerated().forEach { (index, file) in
    try file.rename(to: file.nameWithoutExtension + "\(index)")

Recursively iterate over all folders in a tree:

Folder.home.subfolders.recursive.forEach { folder in
    print("Name : \(folder.name), parent: \(folder.parent)")

Create, write and delete files and folders:

let folder = try Folder(path: "/users/john/folder")
let file = try folder.createFile(named: "file.json")
try file.write(string: "{\"hello\": \"world\"}")
try file.delete()
try folder.delete()

Move all files in a folder to another:

let originFolder = try Folder(path: "/users/john/folderA")
let targetFolder = try Folder(path: "/users/john/folderB")
try originFolder.files.move(to: targetFolder)

Easy access to system folders:



Files can be easily used in either a Swift script, a command line tool, or in an app for iOS, macOS, tvOS or Linux.

Using the Swift Package Manager (preferred)

To install Files for use in a Swift Package Manager-powered tool, script or server-side application, add Files as a dependency to your Package.swift file. For more information, please see the Swift Package Manager documentation.

.package(url: "https://github.com/JohnSundell/Files", from: "4.0.0")

Using CocoaPods or Carthage

Please refer to CocoaPods’ or Carthage’s own documentation for instructions on how to add dependencies using those tools.

As a file

Since all of Files is implemented within a single file, you can easily use it in any project by simply dragging the file Files.swift into your Xcode project.


So, why was this made? As I've migrated most of my build tools and other scripts from languages like Bash, Ruby and Python to Swift, I've found myself lacking an easy way to deal with the file system. Sure, FileManager has a quite nice API, but it can be quite cumbersome to use because of its string-based nature, which makes simple scripts that move or rename files quickly become quite complex.

So, I made Files, to enable me to quickly handle files and folders, in an expressive way. And, since I love open source, I thought - why not package it up and share it with the community? :)

Questions or feedback?

Feel free to open an issue, or find me @johnsundell on Twitter.


Stars: 1556
Help us keep the lights on



4.0.2 - Sep 27, 2019

This release contains patches for two bugs:

  • When calling the createFileIfNeeded set of APIs, the content passed as any newly created file's content was previously ignored. That has now been fixed.
  • When accessing the parent of any folder contained within the file system's root folder, the actual root folder is now correctly returned. Thanks to @MaximeLM for implementing that fix.

View build details and download artifacts on buddybuild: Files (iOS, Files-iOS)

4.0.1 - Sep 24, 2019

This patch restores the copy API to again return the new file/folder that was copied.

View build details and download artifacts on buddybuild: Files (iOS, Files-iOS)

4.0.0 - Sep 7, 2019

Files 4.0 brings a brand new, streamlined implementation, improved error handling, more thorough documentation, and a more modern API. Since it's a new major release, some breaking API changes have been made. Here's everything that's new:

  • The FileSystem class has been removed. To perform operations relative to the root of the file system, use the new Folder.root API instead. To use a custom FileManager, call managedBy() on any File or Folder.
  • FileSystem.Item has been replaced by the Location protocol, and FileSystem.Item.Kind has been replaced by LocationKind.
  • You can now consistently use either a name or path when using any API for creating or referring to files and subfolders within a folder.
  • Methods accepting a path now use the simplified at: label, rather than atPath:.
  • External argument labels have been removed for APIs that write new contents to a file. So write(string:) and write(data:) are now two overloads of the same method: write(_:).
  • All of the APIs for creating files now only accept Data as a file's initial contents. To write strings to a file, first create the file and then call file.write(string) on it.
  • File now has a creationDate property.
  • Folder now has static properties for accessing the current user's Library and Documents folders.
  • Error handling has been improved to now use a unified FilesError type, that always contains the path at which the error occurred, as well as a Reason - which can either be for locations, writes, or reads. See the LocationError, WriteError and ReadError type aliases for the three types of errors that Files can throw.
  • Computed properties that don't have O(1) time complexity have now been changed into methods instead. That includes name(), count(), and last() on file/folder sequences, since computing those requires enumerating the sequence. The time complexity of each sequence operation is now also documented.
  • FileSystemSequence is now Folder.ChildSequence, and each sequence can now easily be turned into a recursive one by accessing the recursive property. The same is also true for including hidden files, which is now done by accessing the includingHidden property on a sequence. The makeFileSequence(...) and makeSubfolderSequence(...) APIs have been removed in favor of constructing customized sequences using those new computed properties.

View build details and download artifacts on buddybuild: Files (iOS, Files-iOS)

3.1.0 - Apr 5, 2019

  • Both File and Folder now have a path(relativeTo:) API, which makes it easy to calculate a given item's path relative to one of its parent folders.
  • FileSystem.documentFolder and FileSystem.libraryFolder are now only available on macOS.

View build details and download artifacts on buddybuild: Files (iOS, Files-iOS)

3.0.0 - Mar 26, 2019

Files now uses Swift 5.0, which makes it incompatible with toolchains with versions lower than 4.2.

View build details and download artifacts on buddybuild: Files (iOS, Files-iOS)