Platform Language: Swift CocoaPods Carthage
downloads Trello Board GITTER: join chat License
Become a Patron! Buy me a coffee
安装使用许可证文档

FileKit 是一个 Swift 框架,用于实现简单而富有表现力的文件管理。

开发工作在 develop 分支中进行。

安装

兼容性

使用 CocoaPods 安装

CocoaPods 是一个用于 Objective-C 和 Swift 的集中式依赖管理器。访问这里了解更多。

  1. 将项目添加到您的 Podfile

    use_frameworks!
    
    pod 'FileKit', '~> 5.0.0'
  2. 运行 pod install 并打开 .xcworkspace 文件以启动 Xcode。

  3. 导入 FileKit 框架。

    import FileKit

使用 Carthage 安装

Carthage 是一个用于 Objective-C 和 Swift 的去中心化依赖管理器。

  1. 将项目添加到您的 Cartfile

    github "nvzqz/FileKit"
    
  2. 运行 carthage update 并按照附加步骤操作,以便将 FileKit 添加到您的项目中。

  3. 导入 FileKit 框架。

    import FileKit

使用

路径

路径使用 Path 结构处理。

let home = Path("~")
let drive: Path = "/Volumes/Macintosh HD"
let file:  Path = "~/Desktop/file\(1)"

操作

新建文件

可以通过在 Path 上调用 createFile() 来写入一个空白文件。

try Path(".gitignore").createFile()
新建目录

可以通过在 Path 上调用 createDirectory() 来创建一个目录。

try Path("~/Files").createDirectory()
try Path("~/Books").createDirectory(withIntermediateDirectories: false)

默认情况下会创建中间目录。

新建符号链接

可以通过在 Path 上调用 createSymlinkToPath(_:) 来创建一个符号链接。

try Path("path/to/MyApp.app").symlinkFile(to: "~/Applications")
print(Path("~/Applications/MyApp.app").exists)  // true
查找路径

您可以查找桌面下五层文件夹深度的所有扩展名为“.txt”的路径,使用以下代码:

let textFiles = Path.userDesktop.find(searchDepth: 5) { path in
    path.pathExtension == "txt"
}

负数 searchDepth 将使其运行直到检查完 self 中的每个路径。

您甚至可以将一个函数映射到找到的路径,并获得非 nil 结果

let documents = Path.userDocuments.find(searchDepth: 1) { path in
    String(path)
}
遍历路径

由于 Path 遵循 SequenceType,因此可以使用 for 循环进行遍历。

for download in Path.userDownloads {
    print("Downloaded file: \(download)")
}
当前工作目录

可以使用 Path.Current 更改进程的当前工作目录。

要快速将当前工作目录更改为某个路径并在之后返回,可以使用 changeDirectory(_:) 方法

Path.userDesktop.changeDirectory {
    print(Path.current)  // "/Users/nvzqz/Desktop"
}
公共祖先

可以获取两个路径之间的公共祖先

print(Path.root.commonAncestor(.userHome))       // "/"
print("~/Desktop"  <^> "~/Downloads")            // "~"
print(.UserLibrary <^> .UserApplicationSupport)  // "/Users/nvzqz/Library"
+ 运算符

附加两个路径并返回结果

// ~/Documents/My Essay.docx
let essay = Path.userDocuments + "My Essay.docx"

它也可以用于连接字符串和路径,使字符串值预先成为 Path

let numberedFile: Path = "path/to/dir" + String(10)  // "path/to/dir/10"
+= 运算符

将右侧路径附加到左侧路径。也适用于 String

var photos = Path.userPictures + "My Photos"  // ~/Pictures/My Photos
photos += "../My Other Photos"                // ~/Pictures/My Photos/../My Other Photos
% 运算符

返回路径的标准化版本。

let path: Path = "~/Desktop"
path% == path.standardized  // true
* 运算符

返回路径的已解析版本。

let path: Path = "~/Documents"
path* == path.resolved  // true
^ 运算符

返回路径的父路径。

let path: Path = "~/Movies"
path^ == "~"  // true
->> 运算符

将左侧路径的文件移动到右侧路径。

Path 对应项:moveFile(to:)

File 对应项:move(to:)

->! 运算符

强制将左侧路径的文件移动到右侧路径,方法是在移动文件之前删除左侧路径上的任何内容。

+>> 运算符

将左侧路径的文件复制到右侧路径。

Path 对应项:copyFile(to:)

File 对应项:copy(to:)

+>! 运算符

强制将左侧路径的文件复制到右侧路径,方法是在复制文件之前删除左侧路径上的任何内容。

=>> 运算符

在右侧路径创建左侧路径的符号链接。

Path 对应项:symlinkFile(to:)

File 对应项:symlink(to:)

=>! 运算符

强制在右侧路径创建左侧路径的符号链接,方法是在创建符号链接之前删除左侧路径上的任何内容。

下标

Path 进行下标操作将返回其所有组件,直到并包括该索引。

let users = Path("/Users/me/Desktop")[1]  // /Users
standardize()

标准化路径。

与执行以下操作相同

somePath = somePath.standardized
resolve()

解析路径的符号链接。

与执行以下操作相同

somePath = somePath.resolved

文件

可以使用 FileDataType(用于其数据类型)来创建文件。

let plistFile = File<Dictionary>(path: Path.userDesktop + "sample.plist")

文件可以按大小进行比较。

运算符

|> 运算符

将左侧的数据写入右侧的文件。

do {
    try "My name is Bob." |> TextFile(path: Path.userDesktop + "name.txt")
} catch {
    print("I can't write to a desktop file?!")
}

TextFile

TextFile 类允许读取和写入字符串到文件。

尽管它是 File<String> 的子类,但 TextFile 提供了一些 File<String> 不具备的功能。

|>> 运算符

将左侧的字符串附加到右侧的 TextFile

let readme = TextFile(path: "README.txt")
try "My Awesome Project" |> readme
try "This is an awesome project." |>> readme

NSDictionaryFile

File<NSDictionary> 的类型别名。

NSArrayFile

File<NSArray> 的类型别名

NSDataFile

File<NSData> 的类型别名

DataFile

DataFile 类允许读取和写入 Data 到文件。

尽管它是 File<Data> 的子类,但 DataFile 提供了一些 File<Data> 不具备的功能。您可以指定 Data.ReadingOptionsData.WritingOptions

Encodable/Decodable

您可以将任何 Codable 对象与 File 一起使用。

extension AnyCodableClass: JSONReadableWritable {} // if you want json encoding/decoding

let codableFile = File<AnyCodableClass>(path: path)
try codableFile.write(toEncode)
let decoded: AnyCodableClass = try codableFile.read()

或者,您可以使用实用程序方法

try FileKit.write(toEncode, to: path)
let decoded: AnyCodableClass = try FileKit.read(from: path)

文件权限

FilePermissions 结构允许查看当前进程对于给定文件的权限。

let swift: Path = "/usr/bin/swift"
print(swift.filePermissions)  // FilePermissions[read, execute]

数据类型

所有符合 DataType 的类型都可以用于满足 File 的泛型类型。

Readable 协议

Readable 类型必须实现静态方法 read(from: Path)

所有 Readable 类型都可以使用 init(contentsOfPath:) 初始化。

Writable 协议

Writable 类型必须实现 write(to: Path, atomically: Bool)

write(to: Path) 完成的写入操作默认是原子性的。

WritableToFile

具有 write(toFile:atomically:) 方法(该方法接受 String 作为文件路径)的类型,可以通过简单地遵循 WritableToFile 来遵循 Writable 协议。

WritableConvertible

如果类型本身不能写入文件,但可以输出可写入的类型,那么它可以遵循 WritableConvertible 并以此方式成为 Writable

FileKitError

FileKit 操作抛出的所有错误的类型都是 FileKitError

错误可以直接转换为 String 以进行任何日志记录。如果只需要错误消息,FileKitError 具有一个 message 属性,说明了错误发生的原因。

// FileKitError(Could not copy file from "path/to/file" to "path/to/destination")
String(FileKitError.copyFileFail(from: "path/to/file", to: "path/to/destination"))

许可证

FileKit 及其资源在 MIT 许可证下发布。资源可以在 assets 分支中找到。