FileKit 是一个 Swift 框架,用于实现简单而富有表现力的文件管理。
开发工作在 develop
分支中进行。
OS X 10.9+ / iOS 8.0+ / watchOS 2.0 / tvOS 9.0
Xcode 7.1+, Swift 2.1+
CocoaPods 是一个用于 Objective-C 和 Swift 的集中式依赖管理器。访问这里了解更多。
将项目添加到您的 Podfile。
use_frameworks!
pod 'FileKit', '~> 5.0.0'
运行 pod install
并打开 .xcworkspace
文件以启动 Xcode。
导入 FileKit 框架。
import FileKit
Carthage 是一个用于 Objective-C 和 Swift 的去中心化依赖管理器。
将项目添加到您的 Cartfile。
github "nvzqz/FileKit"
运行 carthage update
并按照附加步骤操作,以便将 FileKit 添加到您的项目中。
导入 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
标准化路径。
与执行以下操作相同
somePath = somePath.standardized
解析路径的符号链接。
与执行以下操作相同
somePath = somePath.resolved
可以使用 File
和 DataType
(用于其数据类型)来创建文件。
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
类允许读取和写入字符串到文件。
尽管它是 File<String>
的子类,但 TextFile
提供了一些 File<String>
不具备的功能。
将左侧的字符串附加到右侧的 TextFile
。
let readme = TextFile(path: "README.txt")
try "My Awesome Project" |> readme
try "This is an awesome project." |>> readme
File<NSDictionary>
的类型别名。
File<NSArray>
的类型别名
File<NSData>
的类型别名
DataFile
类允许读取和写入 Data
到文件。
尽管它是 File<Data>
的子类,但 DataFile
提供了一些 File<Data>
不具备的功能。您可以指定 Data.ReadingOptions
和 Data.WritingOptions
您可以将任何 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
类型必须实现静态方法 read(from: Path)
。
所有 Readable
类型都可以使用 init(contentsOfPath:)
初始化。
Writable
类型必须实现 write(to: Path, atomically: Bool)
。
由 write(to: Path)
完成的写入操作默认是原子性的。
具有 write(toFile:atomically:)
方法(该方法接受 String
作为文件路径)的类型,可以通过简单地遵循 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"))