FileKit 是一个允许简单且表达力丰富的文件管理的 Swift 框架。
开发在 develop 分支进行。
OS X 10.9+ / iOS 8.0+ / watchOS 2.0 / tvOS 9.0
Xcode 7.1+, Swift 2.1+
路径使用 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").createSymlinkToPath("~/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"+= 运算符将右侧路径连接到左侧路径上。也适用于字符串。
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 对应函数: moveFileToPath(_:)
File 对应函数: moveToPath(_:)
->! 运算符在移动文件之前先删除左侧路径上的所有内容,强制将左侧路径上的文件移动到右侧路径。
+>> 运算符将左侧路径上的文件复制到右侧路径。
Path 对应函数: copyFileToPath(_:)
File 对应函数: copyToPath(_:)
+>! 运算符在复制文件之前先删除左侧路径上的所有内容,强制将左侧路径上的文件复制到右侧路径。
=>> 运算符在右侧路径创建左侧路径的符号链接。
Path 对应函数: symlinkFileToPath(_:)
File 对应函数: symlinkToPath(_:)
=>! 运算符在创建符号链接之前先删除左侧路径上的所有内容,强制在右侧路径创建左侧路径的符号链接。
下标访问一个 Path 将返回其所有组成部分直到并包括索引。
let users = Path("/Users/me/Desktop")[1] // /Usersstandardize()标准化路径。
等同于执行
somePath = somePath.standardizedresolve()解析路径的符号链接。
等同于执行
somePath = somePath.resolved可以使用 File 和一个 DataType 作为其数据类型来创建文件。
let plistFile = File<NSDictionary>(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 类允许读取和写入字符串到文件。
尽管它是 File 的子类,但 TextFile 仍然提供了一些 File 所不具备的功能。
|>> 操作符将左边的字符串追加到右边的 TextFile。
let readme = TextFile(path: "README.txt")
try "My Awesome Project" |> readme
try "This is an awesome project." |>> readme是 File 的别名。
是 File 的别名。
是 File 的别名。
FilePermissions 结构体允许查看针对给定文件当前进程的权限。
let swift: Path = "/usr/bin/swift"
print(swift.filePermissions) // FilePermissions[Read, Execute]所有遵守 DataType 的类型都可以用作 File 的泛型类型。
Readable 类型必须实现静态方法 readFromPath(_:)。
所有 Readable 类型都可以使用 init(contentsOfPath:) 进行初始化。
Writable 类型必须实现 writeToPath(_:atomically:)。
使用 writeToPath(_:) 实现的写入默认是原子性的。
具有接收文件路径字符串的 writeToFile(_:atomically:) 方法的类型可以简单地通过遵守 WritableToFile 来遵守 Writable。
如果类型本身不能写入文件,但可以输出可写入类型,那么它可以遵守 WritableConvertible,并通过这种方式成为 Writable。
所有由 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"))