运行 Shell 命令 | 解析命令行参数 | 处理文件和目录
一个强类型的 Swift 库,用于处理本地文件和目录。
它区分文件路径和目录路径,以及路径和实际的文件和目录,因为程序员知道它们是什么,并且编译器也知道,这会非常有帮助。
另请参阅
print
函数相同的方式将文本写入文件。路径 (Path)
文件系统中某个条目的位置,该条目可能存在也可能不存在。它可以是 DirectoryPath、FilePath 或 AnyPath。
文件 (File)
一个现有的常规文件或类似文件的东西,你可以从中读取和/或写入,例如流、管道或套接字。 或者指向其中任何一个的符号链接。
目录 (Directory)
一个现有的目录或指向目录的符号链接。 基本上你可以在终端中 cd
进入的任何东西。
条目 (Item)
(暂缺更好的术语)
一个文件或一个目录。 文件系统中具有路径的任何东西。
当 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
}
将 .package(url: "https://github.com/kareman/FileSmith", from: "0.3.0")
添加到你的 Package.swift 中
import PackageDescription
let package = Package(
name: "somename",
dependencies: [
.package(url: "https://github.com/kareman/FileSmith", from: "0.3.0")
]
)
并运行 swift build
。
将 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