运行 shell 命令 | 解析命令行参数 | 处理文件和目录
FileSmith
一个用于处理本地文件和目录的强类型 Swift 库。
它区分文件路径和目录路径,以及路径和实际文件和目录,因为程序员知道哪些是哪些,当编译器也知道的话,它可能更为有用。
另请参阅
特性
- 分别为文件路径、目录路径、读取文件、写入文件和目录提供独立类型。
- 使用 Swift 原生的错误处理。
- 列出目录内容(如果需要,递归列出)。
- 使用 glob 通配符模式过滤。
- 沙箱模式禁止更改当前工作目录以外的更改。
- 类似于使用 Swift 的
print
函数将文本写入文件。
术语
路径
项目的位置(可能存在或不存在于本地文件系统中)。它可以是DirectoryPath、FilePath或AnyPath。
文件
一个现有的常规文件或类似文件的对象,你可以从中读取和/或写入,如流、管道或套接字。或者指向这些对象的符号链接。
目录
一个现有的目录或指向目录的符号链接。基本上,在终端中你可以使用cd
命令进入的任何东西。
项目
(没有更好的名称)
文件或目录。文件系统中任何具有路径的对象。
安全第一
当Directory.sandbox == true
(默认是这样)时,你只能在当前工作目录下更改文件或创建新文件和目录。尝试在其他地方进行更改将引发错误。
使用方法
更改当前工作目录
DirectoryPath.current = "/tmp"
Directory.current = Directory.createTempDirectory()
路径
// common functionality
let dirpath = DirectoryPath("dir/dir1")
var filepath: FilePath = "file.txt"
filepath = FilePath(base: "dir", relative: "file.txt")
filepath = FilePath("dir/file.txt")
filepath.relativeString
filepath.base?.string
filepath.absoluteString
filepath.string // relativeString ?? absoluteString
filepath.name
filepath.nameWithoutExtension
filepath.extension
// DirectoryPath only
dirpath.append(file: "file.txt") // FilePath("dir/dir1/file.txt")
dirpath.append(directory: "dir2") // DirectoryPath("dir/dir1/dir2")
dirpath.isAParentOf(filepath)
创建
var dir1 = try dirpath.create(ifExists: .replace)
var dir2 = try Directory(create: "dir/dir2", ifExists: .throwError)
var dir3 = try dir2.create(directory: "dir3", ifExists: .open) // dir/dir2/dir3
var file1_edit = try filepath.create(ifExists: .open)
let file2_edit = try WritableFile(create: "file2.txt", ifExists: .open)
let file3_edit = try dir1.create(file: "file3.txt", ifExists: .open) // dir/dir1/file3
打开
dir1 = try dirpath.open()
dir2 = try Directory(open: "dir/dir2")
dir3 = try dir2.open(directory: "dir3")
let file1 = try filepath.open()
let file2 = try ReadableFile(open: "file2.txt")
let file3 = try dir1.open(file: "file3.txt")
读/写
file1_edit.encoding = .utf16 // .utf8 by default
file1_edit.write("some text...")
file1_edit.print("Just like Swift's own 'print' function.")
file1_edit.print(2, "words", separator: "-", terminator: "")
file2.write(to: &file1_edit)
let contents: String = file3.read()
for line in file3.lines() { // a lazy sequence
// ...
}
while let text = file3.readSome() {
// read pipes etc. piece by piece, instead of waiting until they are closed.
}
搜索/过滤
Directory.current.files(recursive: true) // [file2.txt, dir/file1.txt, dir/dir1/file3.txt]
dir1.files("*3.*", recursive: true) // [file3.txt]
Directory.current.directories(recursive: true) // [dir, dir/dir1, dir/dir2, dir/dir2/dir3]
符号链接
let dir1_link = try Directory(createSymbolicLink: "dir1_link", to: dir1, ifExists: .open)
let dir2_link = try dir1.create(symbolicLink: "dir2_link", to: dir2, ifExists: .open)
let file1_link = try ReadableFile(createSymbolicLink: "file1_link", to: file1, ifExists: .open)
let file2_link = try dir2.create(symbolicLink: "file2_link", to: file2, ifExists: .open) as ReadableFile
杂项
// the path of a file or directory
file1.path // FilePath
dir1.path // DirectoryPath
// remove files and directories
try file1_edit.delete()
try dir1.delete()
类型
当打开文件时,符号链接始终被追踪,所以文件的类型永远不会是 .symbolicLink,但不存在的目标可以是为 .brokenSymbolicLink。
FileType("file.txt")
FileType(filepath)
public enum FileType: Equatable, Hashable {
case regularFile
case directory
case characterSpecial
case blockSpecial
case socket
case brokenSymbolicLink
case namedPipe
case unknown
}
安装
Swift 包管理器
将 .Package(url: "https://github.com/kareman/FileSmith", "0.2.1")
添加到您的 Package.swift 文件中。
import PackageDescription
let package = Package(
name: "somename",
dependencies: [
.Package(url: "https://github.com/kareman/FileSmith", "0.2.1")
]
)
然后运行 swift build
。
CocoaPods
将FileSmith
添加到您的Podfile
中。
pod "FileSmith", git: "https://github.com/kareman/FileSmith.git"
然后运行pod install
来安装它。
许可协议
在MIT许可协议(MIT)下发布,https://open-source.org.cn/licenses/MIT
Kåre Morstøl,NotTooBad Software