MIT License

项目介绍

JohnSundell/Files 是一个托管在 GitHub 上的开源项目,主要使用 Swift 编写,采用 MIT License 许可证,目前获得 2.6k 个 Star、196 次 Fork。

仓库全名
JohnSundell/Files
开源许可证
MIT License
Star 数
2.6k
Fork 数
196
未关闭 Issue
25

README 摘要

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. Features [X] Modern, object-oriented API for accessing, reading and writing files & folders. [X]…

完整内容见 GitHub 原始 README 或本页 。

常见问题

Files 用什么语言开发?

主要使用 Swift 编写,采用 MIT License 许可证,目前有 2.6k 个 Star。

Files 可以免费商用吗?

仓库采用 MIT License 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 Files 的源码?

可以直接克隆仓库:git clone https://github.com/JohnSundell/Files.git,默认分支为 master;安装与运行步骤见仓库 README。

Files 最近还在维护吗?

仓库最近一次更新为 2025年5月30日,当前有 25 个未关闭 Issue;Star 数为 2.6k,可作为社区活跃度的参考。

简要分析

热度分
3071
价值分
1642
活跃状态
活跃

语言占比

Ruby
Shell
Swift

Release

README

“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.

Features

  • 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.

Examples

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

Installation

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.

Backstory

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.

评论

暂无评论