FileKit 是一个 Swift 框架,它允许简单的文件管理。
开发在 develop
分支上进行。
安装
兼容性
-
OS X 10.9+ / iOS 8.0+ / watchOS 2.0 / tvOS 9.0
-
Xcode 7.1+, Swift 2.1+
使用 CocoaPods 安装
CocoaPods 是Objective-C 和 Swift的集中式依赖管理器。访问 这里 了解更多信息。
-
将项目添加到您的 Podfile。
use_frameworks! pod 'FileKit', '~> 5.0.0'
-
运行
pod install
并打开.xcworkspace
文件以启动 Xcode。 -
导入 FileKit 框架。
import FileKit
使用Carthage进行安装
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
中的路径都被检查。
您甚至可以将一个函数映射到找到的路径上,并获得非空结果
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
文件
可以使用具有数据类型(DataType)的File
创建文件。
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
NSDictionaryFile
它是File<NSDictionary>
的类型别名。
NSArrayFile
表示为 File<бас>NSAayсе巴斯>
的别称
NSDataFile
表示为 File<巴斯>NSData巴斯>
的别称
DataFile
DataFile
类允许将 Data
读写到文件。
虽然它是 File
的子类,但 DataFile
提供了一些 File
没有的功能。您可以指定 Data.Read_DestroyOptions
和 Data.Write_DestroyOptions
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
类型必须实现静态方法 read(from: Path)
。
所有Readable
类型都可以使用init(contentsOfPath:)
进行初始化。
可写协议
Writable
类型必须实现write(to: Path, atomically: Bool)
。
使用write(to: Path)
完成的写入默认是原子性的。
将内容写入文件
具有使用文件路径字符串的 write(toFile:atomically:)
方法的类型可以通过简单地符合 WritableToFile
来符合 Writable
。
可写转换
如果一个类型本身不能写入到文件,但可以输出可写类型,那么它可以通过符合WritableConvertible
成为可写的。
文件工具包错误
FileKit操作抛出的所有错误的类型是FileKitError
。
错误可以直接转换为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"))