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] // /Users
standardize()
标准化路径。
等同于执行
somePath = somePath.standardized
resolve()
解析路径的符号链接。
等同于执行
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"))