运行 Shell 命令 | 解析命令行参数 | 处理文件和目录


Build Status Platforms

FileSmith

一个强类型的 Swift 库,用于处理本地文件和目录。

它区分文件路径和目录路径,以及路径和实际的文件和目录,因为程序员知道它们是什么,并且编译器也知道,这会非常有帮助。

另请参阅

特性

术语

路径 (Path)
文件系统中某个条目的位置,该条目可能存在也可能不存在。它可以是 DirectoryPathFilePathAnyPath

文件 (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
}

安装

Swift 包管理器 (Swift Package Manager)

.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

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