仓颉语言 std.fs 文件系统包实践指南:路径、文件、目录与链接操作 API 详解
人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载std.fs是仓颉标准库中负责文件系统操作的官方包提供对文件、文件夹、路径与文件元数据的全套操作能力并支持 Linux、macOS、Windows 与 HarmonyOS 四大平台。本文以std.fs的功能分组为主线系统梳理路径操作、文件操作、目录操作、链接操作与异常处理的完整 API 清单并结合std/fs目录下的 API 文档与可运行示例给出每个关键接口的参数语义、返回值、异常行为与典型调用方式帮助你快速掌握用仓颉完成文件创建、读写、复制、重命名、删除、目录遍历与路径规范化等日常开发任务。一、包概览与平台支持std.fsfile system包提供对文件、文件夹、路径、文件元数据信息的一些操作函数核心能力包括路径的解析、规范化、拼接与拆分文件的创建、打开、关闭、流式读写与属性查询目录的创建、遍历、移动、复制与删除硬链接与符号链接的创建和读取文件异常的统一处理。平台支持情况目前支持 Linux、macOS、Windows 和 HarmonyOS 平台下使用详见 包总览。在使用时需要注意部分 API 在 Windows 与其他系统上的行为存在差异例如路径分隔符、权限判断语义下文会逐一说明。在仓库中与std.fs相关的完整资料分布在三个位置资料类型位置内容包级总览与分组索引std/fs/readme.md、std/fs/fs_package_overview.md功能分组、API 速查详细 API 参考std/fs/fs_package_api/函数、类、枚举、结构体、异常类的完整原型与参数说明可运行示例std/fs/fs_samples/Directory、File、FileInfo、Path 四组示例代码二、路径操作Path 与 canonicalize路径操作相关 API 用于处理文件路径的解析、规范化、拼接等操作是其他所有文件系统操作的基础。对应函数与类型见 函数参考 与 Path 结构体参考。API 名称原型功能描述Pathstruct Path提供路径相关的函数canonicalize(Path) - Path将 Path 实例规范化获取绝对路径形式的规范化路径canonicalize(String) - Path用 path 字符串构造 Path 实例并进行规范化2.1 Path 结构体路径的核心抽象Path是仓颉中表示本地路径的结构体声明如下public struct Path : EquatablePath Hashable ToString { public static const Separator: String PATH_SEPARATOR public static const ListSeparator: String PATH_LISTSEPARATOR public init(rawPath: String) }要点说明路径长度限制路径的字符串最大支持 4096 个字节包括结束符\0Windows 平台已支持 DOS 设备路径和 UNC 路径长度限制跟随系统。构造不校验init(rawPath: String)创建实例时不检查路径字符串是否合法支持绝对路径和相对路径。平台分隔符静态常量Separator在 Windows 系统中为\\非 Windows 系统中为/ListSeparator路径列表分隔符在 Windows 中为;非 Windows 中为:。Path 提供的主要成员属性与方法成员原型说明parentprop parent: Path获取父路径以最后一个有效文件分隔符为分界末尾分隔符被忽略无父目录时返回空 PathfileNameprop fileName: String获取文件名含扩展名Windows 下 fileName 不包括卷名部分extensionNameprop extensionName: String获取扩展名按最后一个r.划分无扩展名返回空字符串fileNameWithoutExtensionprop fileNameWithoutExtension: String获取不含扩展名的文件名isAbsolute()/isRelative()(): Bool判断路径是否为绝对/相对路径Unix 中以/开头为绝对路径join(path)(Path/String) - Path在当前路径后拼接另一路径参数为绝对路径时抛出 FSExceptionnormalize()(): Path字符串级规范化不执行任何 I/O 操作hashCode()(): Int64获取路径哈希值operator (that: Path): Bool判等时对双方做规范化后再比较字符串其中normalize()的规范化规则值得注意将连续多个分隔符合并为单个删除末尾分隔符根目录或卷名中的除外删除.元素删除路径内的..元素及其前面的非..元素删除开始于根路径的..元素相对路径保留开头的../若结果为空路径则返回Path(.)。2.2 canonicalize获取绝对规范化路径public func canonicalize(path: Path): Path public func canonicalize(path: String): Path功能将路径规范化获取绝对路径形式的规范化路径。与Path.normalize()的纯字符串处理不同canonicalize会处理所有的中间引用和软链接例如对于路径/foo/test/../test/bar.txt该函数会返回/foo/test/bar.txt。注意UNC 路径下的软链接无法被规范化。参数与异常参数pathPath 或 String——待规范化的路径返回值规范化后的Path实例异常路径不存在或无法规范化时抛出 FSException路径为空或包含字符串结束符时抛出IllegalArgumentException见 core 包异常参考。一个典型的组合用法来自 path_samples.md将含大量./、../的复杂相对路径规范化为与canonicalize(filePath)一致的绝对路径再进行判等let curCanonicalizedPath: Path canonicalize(Path(.)) let fileCanonicalizedPath: Path canonicalize(Path(././././a/./../a/b/../../a/b/c/.././../../a/b/c/d.cj)) if (fileCanonicalizedPath canonicalize(filePath) fileCanonicalizedPath.toString() curCanonicalizedPath.toString() /a/b/c/d.cj) { println(canonicalize filePath: success) }三、文件操作File、OpenMode 与文件级函数文件操作相关 API 用于创建、读写、删除文件等操作对应 File 类参考、OpenMode 枚举参考 与 FileDescriptor 结构体参考。API 名称原型功能描述Fileclass File提供对文件进行操作的函数包括文件的打开、创建、关闭、流式读写操作、查询属性等OpenModeenum OpenMode表示不同的文件打开模式FileDescriptorstruct FileDescriptor用于获取文件句柄信息copy(Path, Path, Bool) - Unit复制文件copy(String, String, Bool) - Unit复制文件rename(Path, Path, Bool) - Unit重命名文件rename(String, String, Bool) - Unit重命名文件remove(Path, Bool) - Unit删除文件remove(String, Bool) - Unit删除文件removeIfExists(Path, Bool) - Bool判断目标文件是否存在如果存在则删除removeIfExists(String, Bool) - Bool判断目标文件是否存在如果存在则删除exists(Path) - Bool判断文件是否存在exists(String) - Bool判断文件是否存在3.1 OpenMode四种文件打开模式OpenMode枚举决定了File对象的行为语义声明如下public enum OpenMode : ToString EquatableOpenMode { | Read | Write | Append | ReadWrite }枚举值语义Read只读方式打开文件文件不存在时抛出 FSExceptionWrite只写方式打开文件文件存在时截断为零字节大小不存在则创建Append追加写入方式打开文件文件不存在则创建ReadWrite可读可写方式打开文件文件不存在则创建但不会截断文件3.2 File 类打开、读写、定位与截断File类实现了Resource IOStream Seekable三个接口声明如下public class File : Resource IOStream Seekable { public init(path: String, mode: OpenMode) public init(path: Path, mode: OpenMode) }两个重要约定创建的File对象会默认打开对应的文件使用结束后必须及时调用close()关闭否则会造成资源泄露非法路径指以下情况之一路径中包含空格、制表符、换行符等非法字符包含特殊字符或控制字符包含不存在的目录或文件包含无法访问权限不足或被锁定的目录或文件。输入路径时应避免非法字符。File 的核心成员与成员函数成员/函数原型说明fileDescriptorprop fileDescriptor: FileDescriptor获取文件描述符句柄信息infoprop info: FileInfo获取文件元数据信息lengthprop length: Int64获取文件头至文件尾的数据字节数canRead()/canWrite()(): Bool是否可读/可写由创建时的 openMode 决定关闭后返回 falseclose()(): Unit关闭文件对象isClosed()(): Bool判断是否已关闭read(buffer)(ArrayByte): Int64从文件读出数据到 buffer返回读取字节数读完后返回 0write(buffer)(ArrayByte): Unit将 buffer 数据写入文件buffer 为空则直接返回seek(sp)(SeekPosition): Int64将光标跳转到指定位置返回头部到跳转后位置的字节偏移setLength(length)(Int64): Unit将文件截断为指定长度length 大于当前长度时用 0 填充不改变光标位置flush()(): Unit因 File 不存在缓冲区该函数没有具体作用其中seek的位置由 SeekPosition 指定如SeekPosition.Begin(10)、SeekPosition.End(-10)。指定的位置不能位于文件头部之前可以超过文件末尾但最大偏移不能超过当前文件系统允许的最大值一般为最大文件大小减去 4096 字节。File 还提供一组实用的静态函数静态函数原型说明create(Path/String): File以只写模式创建文件上级目录不存在或文件已存在时抛出 FSExceptioncreateTemp(directoryPath): File在指定目录创建临时文件名称形如tmpFileXXXXXX不使用的临时文件应手动删除readFrom(Path/String): ArrayByte读取文件全部内容以字节数组返回writeTo(path, buffer): Unit以覆盖方式写入文件存在时截断为零字节不存在则创建appendTo(path, buffer): Unit以追加方式写入文件不存在则创建3.3 文件级全局函数copy / rename / remove / removeIfExists / exists这五个函数同时提供Path与String两种重载均要求路径为空或包含字符串结束符时抛出 IllegalArgumentException。exists(path)判断目标地址是否存在返回Bool。copy(sourcePath, to!, overwrite! false)复制文件或目录。当目标位置存在且overwrite为true时要求sourcePath与to的类型一致如源是 Directory目标也必须是 Directory否则抛出 FSException。当前支持的文件类型有文件夹Directory、常规文件Regular file、符号链接SymbolicLink。当overwrite为false且目标地址存在时同样抛出异常。rename(sourcePath, to!, overwrite! false)重命名文件或目录sourcePath必须是已存在的路径。当to是已存在的路径且overwrite为true时会删除现有目标后再重命名为false时抛出异常。注意当overwrite为true时若目标位置是目录将递归删除目录内的所有内容需要谨慎使用。remove(path, recursive! false)删除文件或目录当目标是文件夹时可通过recursive: true递归删除。目录不存在或删除失败时抛出 FSException。removeIfExists(path, recursive! false)判断目标是否存在存在则执行remove并返回true否则返回false。3.4 FileDescriptor文件句柄public struct FileDescriptor public prop fileHandle: IntNativeFileDescriptor用于获取文件句柄File Handle信息。文件句柄是操作系统为跟踪文件分配的数据结构包含文件元数据信息文件名、路径、大小、修改时间等以及文件数据在磁盘上的物理位置。在 Unix/Linux 中句柄通常是非负整数在 Windows 中通常是指向文件对象的指针fileHandle属性以IntNative形式返回该句柄值。四、目录操作Directory 与 FileInfo目录操作相关 API 用于创建、遍历、删除目录等操作对应 Directory 类参考 与 FileInfo 结构体参考。API 名称原型功能描述Directoryclass Directory对应文件系统中的目录提供创建、查询属性以及遍历目录等能力FileInfostruct FileInfo对应文件系统中的文件元数据提供文件属性的查询和设置等函数4.1 Directory创建、临时目录、判空与遍历public class Directory {}Directory 的全部能力通过静态函数提供静态函数原型说明create(path, recursive! false): Unit创建目录recursive: true时逐级创建路径中不存在的目录。目录已存在、非递归时中间存在不存在的目录均抛 FSExceptioncreateTemp(directoryPath): Path在指定目录下创建临时目录返回其路径isEmpty(path): Bool判断指定目录是否为空路径不存在或不是目录时抛 FSExceptionreadFrom(path): ArrayFileInfo获取当前目录的子项目列表顺序取决于文件在系统中的排序walk(path, f: (FileInfo)-Bool): Unit非递归遍历目录子项目对每个子项目执行回调退出条件为遍历结束或回调返回falsewalk的遍历不包含子目录的子项目遍历顺序同样取决于文件在系统中的排序回调函数的返回值表示是否继续遍历可用于提前终止。readFrom返回的ArrayFileInfo可作为自定义递归遍历的起点。4.2 FileInfo文件元数据查询与权限设置public struct FileInfo : EquatableFileInfo { public init(path: Path) public init(path: String) }文件元数据指文件系统中与文件相关的信息包括文件名、文件大小、创建时间、修改时间、访问时间、文件权限、文件所有者等。底层实现不缓存文件属性每次通过 FileInfo 的 API 都是现场获取最新属性——这意味着如果在两次属性获取之间文件被其他用户或进程修改/替换后一次获取的可能不是期望的属性有特殊需求时可通过设置文件权限或加锁来保证。FileInfo 提供以下属性与函数成员/函数说明creationTime/lastAccessTime/lastModificationTime获取创建时间、最后访问时间、最后修改时间类型为DateTimename/path/size文件名等价于this.path.fileName、路径、文件大小文件表示单文件占用空间目录表示其所有文件占用空间parentDirectory以OptionFileInfo形式返回父级目录元数据无父级返回NoneisDirectory()/isRegular()/isSymbolicLink()/isHidden()/isReadOnly()类型与状态判断canRead()/canWrite()/canExecute()权限查询对目录分别表示浏览、删改/建文件、进入目录setReadable(Bool)/setWritable(Bool)/setExecutable(Bool)权限设置返回Bool表示操作是否成功判断两个 FileInfo 是否对应同一文件平台差异提醒详见 FileInfo 结构体参考Windows 下用户始终拥有对目录的执行、可写权限相关判断函数不生效canExecute/canWrite返回 truesetExecutable/setWritable返回 false文件可读权限同样恒为 true文件执行权限由扩展名决定isReadOnly对文件正常、对目录不生效返回 falseLinux 与 macOS 下这些函数均正常使用权限设置期间若文件实体被其他进程修改可能因竞争条件Race Condition导致修改不生效。五、链接操作HardLink 与 SymbolicLink链接操作相关 API 用于处理硬链接和符号链接对应 HardLink 类参考 与 SymbolicLink 类参考。API 名称原型功能描述HardLinkclass HardLink提供处理文件系统硬链接相关接口SymbolicLinkclass SymbolicLink提供处理文件系统符号链接相关接口HardLink.create(link, to!)创建一个新的硬链接到现有路径如果新的路径已存在则不会覆盖。参数link为新路径名称to为现有路径名称路径为空或含空字符抛 IllegalArgumentException创建失败抛 FSException。SymbolicLink.create(link, to!)创建符号链接。注意 Windows 上的特殊行为当目标不存在时创建的是文件符号链接如果目标路径后来被创建为目录该符号链接将不起作用。SymbolicLink.readFrom(path, recursive! false)获取符号链接的目标地址。recursive为true时跟踪指向最终目标的链接并返回目标全路径为false时只读取当前目标链接并返回。读取失败抛 FSException。六、异常处理FSException文件系统操作中可能抛出的异常统一为FSException对应 FSException 类参考。异常类名原型功能描述FSExceptionclass FSException文件流异常类继承了 IO 流异常类public class FSException : IOException { public init() public init(message: String) }FSException继承自 IOException支持无参构造与带错误信息的构造。在实际编码中路径不存在、类型不一致、权限不足、删除/复制/重命名失败等场景都可能抛出该异常另一类常见异常是参数层面的IllegalArgumentException路径为空或包含字符串结束符/空字符时抛出见 core 包异常参考。建议在涉及文件系统操作的代码中对这两类异常做统一捕获与处理。七、可运行示例从建目录到删文件的完整流程std.fs在 std/fs/fs_samples/ 下提供了四组标注verify的可运行示例覆盖目录、文件、元数据与路径四类操作。7.1 Directory 示例directory_samples.md 演示了目录的递归创建、临时目录创建、移动/重命名与复制import std.fs.* main() { let testDirPath: Path Path(./testDir) let subDirPath: Path Path(./testDir/subDir) if (exists(testDirPath)) { remove(testDirPath, recursive: true) } /* 递归创建目录 和 ./testDir/subDir */ Directory.create(subDirPath, recursive: true) if (exists(subDirPath)) { println(The directory ./testDir/subDir is successfully created recursively in current directory.) } /* 在 ./testDir 下创建临时目录 */ let tempDirPath: Path Directory.createTemp(testDirPath) if (exists(tempDirPath)) { println(The temporary directory is created successfully in directory ./testDir.) } /* 将 subDir 移动到临时目录下并重命名为 subDir_new */ let newSubDirPath: Path tempDirPath.join(subDir_new) rename(subDirPath, to: newSubDirPath) if (exists(newSubDirPath) !exists(subDirPath)) { println(The directory ./testDir/subDir is moved successfully to the temporary directory and renamed subDir_new.) } /* 将 subDir_new 拷贝到 ./testDir 下并重命名为 subDir */ copy(newSubDirPath, to: subDirPath, overwrite: false) if (exists(subDirPath) exists(newSubDirPath)) { println(The directory subDir_new is copied successfully to directory ./testDir and renamed subDir.) } remove(testDirPath, recursive: true) return 0 }运行结果The directory ./testDir/subDir is successfully created recursively in current directory. The temporary directory is created successfully in directory ./testDir. The directory ./testDir/subDir is moved successfully to the temporary directory and renamed subDir_new. The directory subDir_new is copied successfully to directory ./testDir and renamed subDir.该示例同时演示了exists前置判断、Path.join拼接与remove的递归清理是目录生命周期管理的标准套路。7.2 File 示例file_samples.md 包含两个示例。第一个演示四种打开模式下的创建、读写、定位与截断import std.fs.* import std.io.* main() { let filePath: Path Path(./tempFile.txt) if (exists(filePath)) { remove(filePath) } /* 以 只写模式 创建新文件写入三遍 123456789\n 并关闭文件 */ var file: File File(filePath, Write) if (exists(filePath)) { println(The file tempFile.txt is created successfully in current directory.\n) } let bytes: ArrayByte 123456789\n.toArray() for (_ in 0..3) { file.write(bytes) } file.close() /* 以 追加模式 打开文件写入 abcdefghi\n 并关闭文件 */ file File(filePath, Append) file.write(abcdefghi\n.toArray()) file.close() /* 以 只读模式 打开文件按要求读出数据并关闭文件 */ file File(filePath, Read) let bytesBuf: ArrayByte ArrayByte(10, repeat: 0) // 从文件头开始的第 10 个字节后开始读出 10 个字节的数据 file.seek(SeekPosition.Begin(10)) file.read(bytesBuf) println(Data of the 10th byte after the 10th byte: ${String.fromUtf8(bytesBuf)}) // 读出文件尾的 10 个字节的数据 file.seek(SeekPosition.End(-10)) file.read(bytesBuf) println(Data of the last 10 bytes: ${String.fromUtf8(bytesBuf)}) file.close() /* 以 读写模式 打开文件按要求进行操作后关闭文件 */ file File(filePath, ReadWrite) // 截断文件大小为 0 file.setLength(0) // 向文件中写入新内容 file.write(The file was truncated to an empty file!.toArray()) // 重置游标到文件头 file.seek(SeekPosition.Begin(0)) // 读取文件内容 let allBytes: ArrayByte readToEnd(file) // 关闭文件 file.close() println(Data written newly: ${String.fromUtf8(allBytes)}) remove(filePath) return 0 }运行结果The file tempFile.txt is created successfully in current directory. Data of the 10th byte after the 10th byte: 123456789 Data of the last 10 bytes: abcdefghi Data written newly: The file was truncated to an empty file!第二个示例演示 File 的静态便捷函数import std.fs.* main() { let filePath: Path Path(./tempFile.txt) if (exists(filePath)) { remove(filePath) } /* 以 只写模式 创建文件并写入 123456789\n 并关闭文件 */ var file: File File.create(filePath) file.write(123456789\n.toArray()) file.close() /* 以 追加模式 写入 abcdefghi\n 到文件 */ File.appendTo(filePath, abcdefghi.toArray()) /* 直接读取文件中所有数据 */ let allBytes: ArrayByte File.readFrom(filePath) println(String.fromUtf8(allBytes)) remove(filePath) return 0 }运行结果123456789 abcdefghi两个示例共同覆盖了Write/Append/Read/ReadWrite四种模式、seek定位、setLength截断、File.create/appendTo/readFrom静态函数以及String.fromUtf8的字节转字符串用法。7.3 FileInfo 示例fileinfo_samples.md 演示了如何通过file.info获取元数据并进行类型判断与权限设置import std.fs.* import std.time.DateTime main() { // 在当前目录下创建一个临时文件以便下面 FileInfo 的演示 let curDirPath: Path canonicalize(Path(./)) let file: File File.createTemp(curDirPath) file.write(123456789\n.toArray()) let fileInfo: FileInfo file.info file.close() /* 获得这个文件父级目录的 FileInfo这个文件的父目录是当前目录 */ let parentDirectory: OptionFileInfo fileInfo.parentDirectory checkResult(parentDirectory Some(FileInfo(curDirPath)), The parentFileInfo is obtained successfully.) /* 判断这个文件是否是软链接、普通文件、目录 */ checkResult(fileInfo.isSymbolicLink(), The file is a symbolic link.) checkResult(fileInfo.isRegular(), The file is a regular file.) checkResult(fileInfo.isDirectory(), The file is a directory.) /* 判断这个文件对于当前用户是否是只读、隐藏、可执行、可读、可写 */ checkResult(fileInfo.isReadOnly(), This file is read-only.) checkResult(fileInfo.isHidden(), The file is hidden.) checkResult(fileInfo.canExecute(), The file is executable.) checkResult(fileInfo.canRead(), The file is readable.) checkResult(fileInfo.canWrite(), The file is writable.) /* 修改当前用户对这个文件的权限这里设置为对当前用户只读 */ checkResult(fileInfo.setExecutable(false), The file was successfully set to executable.) checkResult(fileInfo.setReadable(true), The file was successfully set to readable.) checkResult(fileInfo.setWritable(false), The file was successfully set to writable.) checkResult(fileInfo.isReadOnly(), This file is now read-only.) return 0 } func checkResult(result: Bool, message: String): Unit { if (result) { println(message) } }运行结果The parentFileInfo is obtained successfully. The file is a regular file. The file is readable. The file is writable. The file was successfully set to executable. The file was successfully set to readable. The file was successfully set to writable. This file is now read-only.7.4 Path 示例path_samples.md 中的第一个示例展示了不同路径下parent、fileName、extensionName、fileNameWithoutExtension与绝对/相对判断的输出规律输入路径parentfileNameextensionNamefileNameWithoutExtension绝对/相对/a/b/c/a/bc空c绝对/a/b//ab空b绝对/a/b/c.cj/a/bc.cjcjc绝对/a/a空a绝对//空空空绝对./a/b/c./a/bc空c相对./a/b/./ab空b相对./a/b/c.cj./a/bc.cjcjc相对./空.空空相对.空.空空相对123.空123.空123相对可以看出末尾带分隔符的目录路径fileName取的是目录名本身如/a/b/→b根路径/的 fileName 为空./与.的parent为空extensionName严格按最后一个.划分123.无扩展名c.cj扩展名为cj。第二个示例演示join、判等与canonicalize的组合见上文 2.2 节第三个示例演示通过 Path 创建文件与目录import std.fs.* main() { let curPath: Path Path(./) let dirPath: Path curPath.join(tempDir) let filePath: Path dirPath.join(tempFile.txt) if (exists(dirPath)) { remove(dirPath, recursive: true) } Directory.create(dirPath) if (exists(dirPath)) { println(Directory tempDir is created successfully.) } File.create(filePath).close() if (exists(filePath)) { println(File tempFile.txt is created successfully in directory tempDir.) } remove(dirPath, recursive: true) return 0 }运行结果Directory tempDir is created successfully. File tempFile.txt is created successfully in directory tempDir.八、实践要点总结路径规范优先Path.normalize()只做字符串解析无 I/Ocanonicalize()会解析软链接并返回绝对路径需要真实绝对路径时优先使用canonicalize。记住默认参数copy、rename的overwrite默认false目标存在即抛异常remove、removeIfExists的recursive默认false删除非空目录前需显式传recursive: true。警惕覆盖删除rename(..., overwrite: true)会先删除目标位置的原有文件或目录若目标是目录将递归删除其中所有内容务必谨慎使用。及时关闭资源File对象创建即打开底层文件使用完毕必须close()否则造成资源泄露临时文件tmpFileXXXXXX需要手动删除。按需捕获异常文件系统操作主要抛出 FSExceptionI/O 失败与IllegalArgumentException路径为空或含空字符建议针对业务场景分别处理。留意平台差异Windows 下符号链接、权限判断与路径分隔符行为与其他平台不同跨平台代码应结合 OpenMode 枚举参考、FileInfo 结构体参考 中的平台说明进行适配。如需深入了解每个 API 的完整原型与异常细节可继续查阅 std/fs/fs_package_api/ 下的函数、类、枚举、结构体与异常参考文档。赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉 std.fs 包详解文件、目录与路径操作的完整 API 与实战指南仓颉 std.fs 包详解文件、目录与路径操作的完整 API 与实战指南 本文基于 CangjieCorpus 语料库中 libs/std/fs 下的官方包文文档知识库教程OpenHarmony仓颉 std.fs 包结构体详解FileDescriptor、FileInfo 与 Path 的路径操作及文件元数据实践仓颉 std.fs 包结构体详解FileDescriptor、FileInfo 与 Path 的路径操作及文件元数据实践 仓颉标准库 std.fs 包提供了对文档知识库教程OpenHarmony仓颉标准库 std.fs 文件系统类 API 全解析Directory、File 与链接操作实战指南仓颉标准库 std.fs 文件系统类 API 全解析Directory、File 与链接操作实战指南 导读 std.fs file system是仓颉编程编程语言语言运行时标准库垃圾回收并发编程上一篇终极免费Flash反编译工具JPEXS Free Flash Decompiler完整使用指南下一篇如何快速搭建本地图片搜索引擎3步实现千万级图片秒级检索创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

WorkBuddy + Supabase 快速搭建移动端 App 实战:六阶段与十六坑

WorkBuddy + Supabase 快速搭建移动端 App 实战:六阶段与十六坑

1. 为什么我选择 WorkBuddy 而不是从零手搓一个 App去年年底我接了个私活,需求很明确:做一个内部用的任务协作工具,要有移动端、要能推送、要能离线缓存,最重要的是——两周内上线。当时我第一反应是打开 Android Studio 新建项目…

2026/10/15 20:46:33 阅读更多 →
google-api-nodejs-client 中 Cloud Functions 客户端包的版本演进:从 CHANGELOG 解读 18.0.x 的维护与破坏性变更

google-api-nodejs-client 中 Cloud Functions 客户端包的版本演进:从 CHANGELOG 解读 18.0.x 的维护与破坏性变更

后端 【免费下载链接】google-api-nodejs-client Googles officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication with OAuth 2.0, API Keys and JWT (Service Tokens) is included. 项目地址: h…

2026/10/15 20:46:33 阅读更多 →
彩色圆点气泡跟随鼠标动画:Canvas物理引擎实现指南

彩色圆点气泡跟随鼠标动画:Canvas物理引擎实现指南

1. 项目概述:这不是炫技,是交互体验的底层升级“彩色圆点气泡跟随鼠标光标动画特效”——这名字听起来像前端新手练手的小玩具,但在我过去十年带过的十几个跨平台项目里,它反复出现在三个关键节点:某高校数字艺术实验室…

2026/10/15 20:46:33 阅读更多 →

最新新闻

2026前端AI编程工具实测:从Figma2Code到Agent闭环,TaoToken统一Key怎么配

2026前端AI编程工具实测:从Figma2Code到Agent闭环,TaoToken统一Key怎么配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:39:55 阅读更多 →
给 Coding Agent 装上 LSP:别再让它靠 grep 猜代码,TaoToken 统一 Key 打通工具链

给 Coding Agent 装上 LSP:别再让它靠 grep 猜代码,TaoToken 统一 Key 打通工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:39:55 阅读更多 →
蓝桥杯CT107D实战:DS18B20单总线驱动与避坑指南

蓝桥杯CT107D实战:DS18B20单总线驱动与避坑指南

1. 为什么CT107D上的DS18B20值得单独拿出来讲蓝桥杯单片机组的板子——CT107D,几乎是每个参赛选手绕不开的硬件平台。这块板子上集成了不少外设,数码管、独立按键、矩阵键盘、蜂鸣器、继电器、DS1302、AT24C02、DS18B20、超声波、红外接收等等&#xff0…

2026/10/15 21:39:55 阅读更多 →
Java爬虫实战:用Jsoup高效解析网页表格并导出CSV

Java爬虫实战:用Jsoup高效解析网页表格并导出CSV

简介:这是一个基于Java与Jsoup库抓取网页表格数据的入门实例,适用于在MyEclipse环境中学习网络爬虫原理的开发者,目标是掌握从HTML页面提取结构化表格信息的完整方法。资源包为zip格式,共24个文件,其中包含7个Java源码…

2026/10/15 21:39:55 阅读更多 →
树莓派4 UART多串口配置与通信实战指南

树莓派4 UART多串口配置与通信实战指南

1. 为什么树莓派 4 的 UART 值得单独拿出来聊 树莓派 4 这块板子,但凡你玩过一阵子,大概率都会碰到一个绕不开的需求:接一个串口设备。可能是 GPS 模块、可能是某款工业传感器、可能是和另一块单片机做点对点通信,也可能是调试一个…

2026/10/15 21:39:55 阅读更多 →
大模型指令微调实战:从LoRA选型到数据配比与避坑指南

大模型指令微调实战:从LoRA选型到数据配比与避坑指南

简介:这份PPT面向自然语言处理与大模型方向的学习者与开发者,系统梳理大模型指令微调(Instruction Tuning)的核心概念与整体脉络。内容从NLP四范式切入,依次讲解传统机器学习、深度学习、预训练加微调以及预训练加Prom…

2026/10/15 21:38:54 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →