FileStrict is a Swift 6-compatible, thread-safe fork of the popular Files library. It offers a clean and modern API for working with the file system while adhering to Swift's strict concurrency model to ensure robust and safe file operations.
- Swift 6 Compatibility: Fully updated to leverage Swift 6 concurrency features, such as
async/await
, for safer and more efficient file operations. - Thread-Safe Design: Guarantees thread safety, making it reliable for use in highly concurrent environments.
- Intuitive API: Simplifies file management tasks like reading, writing, copying, and deleting files and folders.
- Cross-Platform Support: Works seamlessly across iOS, macOS, tvOS, and watchOS.
- Error Handling: Provides clear and descriptive error types for easier debugging and management.
FileStrict is built for modern Swift development. By addressing the limitations of the original Files library regarding concurrency and thread safety, FileStrict ensures that your file management operations are secure, reliable, and aligned with current Swift best practices.
FileStrict is available via Swift Package Manager. Simply add it to your Package.swift
file or use Xcode's package integration.
We welcome contributions! If you encounter any issues or have suggestions for enhancements, feel free to submit an issue or pull request on GitHub.
Repository: GitHub - FileStrict
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.
- Modern, object-oriented API for accessing, reading and writing files & folders.
- Unified, simple
do, try, catch
error handling. - 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 {
print(file.name)
}
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("{\"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:
Folder.current
Folder.root
Folder.library
Folder.temporary
Folder.home
Folder.documents
Files can be easily used in either a Swift script, a command line tool, or in an app for iOS, macOS, tvOS or Linux.
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")
Please refer to CocoaPods’ or Carthage’s own documentation for instructions on how to add dependencies using those tools.
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? :)
Feel free to open an issue, or find me @johnsundell on Twitter.