模块契约File API

错误域

文件体系使用统一 xerror,同时按子模块稳定区分错误域:

这些枚举依次属于 xrt.file、xrt.dir、xrt.walk、xrt.link、xrt.root、xrt.fifo 和 xrt.tree。每个常量表示失败的具体操作或阶段,不替代统一错误种类。

错误 Kind 表达跨模块类别,例如不存在、权限、参数、类型、IO、范围和不支持;域内代码表达具体操作阶段;SystemCode 保留 Win32 或 errno。清理失败默认不覆盖触发操作的首个错误,除非清理本身是唯一失败。

设计契约

文件体系按使用层次拆成十三个可裁剪功能组。每一层只复用下层原语,不维护第二套文件实现:

功能宏能力直接依赖
XRT_FEATURE_FILE句柄、二进制 IO、定位、元数据和路径基础操作path_system、time
XRT_FEATURE_FILE_LOCK跨进程共享、排他和字节区间锁file
XRT_FEATURE_FILE_MAP只读、共享写和私有写内存映射file
XRT_FEATURE_FILE_TEMP安全临时文件和公共临时命名底座file、random_secure
XRT_FEATURE_FILE_WHOLE整文件、原子写、复制和移动file_temp
XRT_FEATURE_FILE_TEXT编码检测和 UTF-8 文本读写file_whole、charset_detect
XRT_FEATURE_DIR目录创建、枚举、根目录和空目录操作file
XRT_FEATURE_DIR_TEMP安全临时目录dir、file_temp
XRT_FEATURE_FILE_WALK可控深度优先遍历和统计dir
XRT_FEATURE_FILE_LINK符号链接和硬链接file
XRT_FEATURE_FILE_ROOT句柄锚定的根内路径解析和基础操作file_link
XRT_FEATURE_FILE_TREE目录树复制、移动、删除、清理和统计file_walk、file_whole、file_link
XRT_FEATURE_FILE_FIFOPOSIX FIFO 创建file

路径统一使用 UTF-8。Windows 使用宽字符系统调用并严格转换 UTF-8;POSIX 路径按原始字节交给系统,目录条目通过标志说明名称是否为严格有效 UTF-8。

所有 xfile、xdir 和返回的拥有内存都由 XRT 分配器管理。xfile 与 xdir 是不透明对象,成功关闭后立即失效;即使系统关闭动作返回失败,对象也已经销毁,不能重试关闭或继续使用。

文件对象包含一个共享系统游标。多个线程可以并发使用绝对偏移读写;依赖共享游标的读写和定位仍应由调用方按一组逻辑操作同步。Windows 实现会在单次共享游标或绝对偏移操作内部使用轻量锁,保证绝对偏移操作保存并恢复游标;POSIX 直接使用 pread/pwrite。对象关闭和原生句柄访问不参与内部生命周期同步。独立打开的文件对象拥有独立游标。xrtFileNative 是明确的原生逃生接口,使用原生句柄后由调用方维护 XRT 契约。

Windows 追加文件对象内部持有同一次打开产生的原子追加数据句柄和控制句柄,后者只供文件锁等不能使用追加权限的系统操作。xrtFileNative 只返回数据句柄,不能借此绕过追加语义;xrtClose 统一释放两个句柄。普通文件仍只持有一个句柄。

文件打开

至少指定 READ 或 WRITE。创建、截断、追加、排他和同步标志要求写权限;EXCLUSIVE 还要求 CREATE。APPEND 使用系统追加语义,每次系统写都定位到当时文件末尾,不等价于打开后手动 seek。APPEND | TRUNCATE 在同一次打开中先清空文件,此后仍保持内核原子追加;Windows 从原打开句柄复制受限追加句柄,不进行第二次按路径打开。

NOFOLLOW 禁止跟随末级符号链接或 Windows 重解析点,适合检查和管理链接本身;它不阻止父目录中的链接。SYNC 请求系统同步写语义,但不能替代应用级事务。平台没有对应原语时返回 XERR_UNSUPPORTED,不会静默忽略。Mode 只接受 POSIX 权限低 12 位,创建时仍受进程 umask 影响;Windows 接受但忽略。Share 只控制 Windows 共享策略,POSIX 没有对应的打开限制。

xrtFileOptionsInit 初始化为只读、0666 和 XFILE_SHARE_ALL。传入空选项的 xrtFileOpen 使用同一默认值。xrtOpen 是常用路径,只覆盖标志。文件打开拒绝目录对象。

新打开的 Windows 句柄和 POSIX 文件描述符默认不可由子进程继承。POSIX 优先在 open 时原子设置 O_CLOEXEC,旧平台回退到 FD_CLOEXEC;该策略是固定安全契约,不额外暴露容易误用的“允许继承”标志。

二进制 IO

xrtRead 和 xrtWrite 各执行一次有效系统 IO,允许成功短读或短写。零长度请求允许缓冲为空。计数输出可为空;提供时会先清零,成功后写入实际数量。

EOF 不是 xrtRead 的错误:函数返回 true 且读取量为零。xrtReadFull 持续读取到填满缓冲,提前 EOF 返回 false、错误码为 XFILE_ERROR_EOF,并通过 pRead 保留已经读取的字节数。xrtWriteFull 持续写入;系统成功但不再产生写进度时也返回失败,避免死循环。

xrtReadAt 和 xrtWriteAt 从绝对字节偏移执行单次 IO,不读取也不修改共享游标;完整版本保持相同 EOF、短读、短写和部分计数契约。偏移与实际请求范围必须处于有符号 64 位文件范围。追加句柄拒绝绝对偏移写,避免 POSIX O_APPEND 与 Windows 追加访问产生平台分歧。零长度操作仍验证文件对象和访问权限,但不限制偏移值。

定位和大小

定位、文件大小和偏移均为 64 位。xrtSeek 的位置输出可为空,失败时不承诺输出;xrtTell 要求输出。xrtFileResize 修改已经以写权限打开的文件,扩大时产生平台定义的稀疏或零填充区域。追加句柄拒绝调整大小,避免 POSIX 可截断而 Windows 原子追加权限不能截断的跨平台分歧。xrtFileSetSize 是常用路径,要求普通文件已经存在,不隐式创建。

xrtFlush 把文件数据和系统要求的必要元数据提交到稳定存储。它只覆盖当前文件,不同步父目录项。xrtFileFlags 返回对象创建时经过验证的打开标志,供分层适配器在接管前检查读写能力。xrtFileNative 返回 Windows HANDLE 或 POSIX 文件描述符的整数表示,失败返回 -1;原生句柄由 xfile 持有,调用方不能自行关闭。

文件锁

共享锁要求读权限,排他锁要求写权限。区间使用半开范围;iSize=0 表示从偏移到文件末端,并在系统支持时覆盖后续增长。偏移和有限长度必须处于有符号 64 位文件范围。解除锁时应传入完全相同的范围;整文件函数是偏移和长度均为零的便捷封装。

bWait=false 只尝试一次,存在跨进程冲突时返回 XERR_AGAIN 和 XFILE_ERROR_LOCK。bWait=true 使用系统阻塞锁;当前同步入口没有超时或取消语义,不应放在必须保持响应的事件循环线程。以后可取消的锁等待会建立在任务和上下文层,不改变本组同步原语。

文件锁是协调协议,不是线程互斥量。POSIX 使用 fcntl 建议锁,同一进程内的线程不会彼此冲突,而且进程关闭指向同一文件的其他描述符也可能释放锁;Windows 锁与句柄关联,并会影响遵守系统锁语义的 IO。跨平台代码应在进程内另用同步原语、显式解锁,并避免在持锁期间关闭该文件的其他句柄。锁不会保护通过其他文件名、映射或不遵守建议锁的访问。

文件映射

映射必须包含 READ。READ | WRITE 创建共享写映射并要求文件以非追加方式读写打开;追加句柄只允许只读或私有写映射,不能绕过原子追加契约修改任意偏移。READ | COPY 创建可修改但不回写文件的私有映射;两种写标志互斥。实现会在内部按系统分配粒度扩大并对齐视图,xrtFileMapData 仍精确指向调用方请求的偏移。

xrtFileMap 在创建时验证范围不越过当前文件末端。iSize=0 表示映射到当前末端;偏移恰好等于末端时返回有效空映射,其数据为空、大小为零,仍必须调用 xrtFileUnmap。映射创建后可以关闭原文件句柄,但调用方不得在映射存续期间截断或以其他方式缩小底层文件;这样做可能使后续访问产生系统异常。

映射页面不经过 XRT 分配器,返回地址只借用到解除映射。多个线程可访问同一映射,但数据竞争由调用方同步。xrtFileMapFlush 只接受共享写映射,大小为零表示刷新到映射末端;它把脏页提交给操作系统,不等价于断电持久化。需要稳定存储时,在刷新后继续对仍打开的文件调用 xrtFlush。私有映射不能刷新到文件。

元数据

只有 Available 中对应位有效的字段才能读取。时间统一为 公元 UTC 毫秒;原生时间精度高于毫秒时向负无穷方向取整,因此纪元前不足一毫秒的时间表示为 -1,不会错误折叠成 0。Device 与 Identity 只用于同一运行平台内判断对象身份,不是可持久化 ID。Attributes 保存 Windows 原生属性;Mode 保存 POSIX 模式。平台不提供的创建时间、变更时间或链接数不会用零伪装成有效值。

xrtPathStat 通过 bFollowLink 明确选择末级链接或目标对象;成功才修改 *pInfo。xrtFileStat 查询打开对象。时间设置至少提供一个时间指针,空指针表示保留该项。

xrtPathSetMode 只在 POSIX 提供,Windows 返回 XERR_UNSUPPORTED。xrtPathSetAttributes 只在 Windows 提供,POSIX 返回 XERR_UNSUPPORTED。谓词把“查询失败”压缩成 false;需要区分不存在、权限失败和类型不符时必须使用 xrtPathStat。

基础路径操作

xrtPathRename 执行同卷改名,适用于文件、链接和目录。bReplace=true 使用系统原子替换。bReplace=false 要求目标不存在;Windows、Linux、macOS 和 FreeBSD 使用平台原子排他改名,其他 POSIX 平台只对可硬链接对象提供不覆盖回退,目录返回 XERR_UNSUPPORTED,绝不使用“先检查再替换”的竞态方案。跨卷返回系统错误,不隐式复制。

xrtFileDelete 删除非目录文件或链接自身,不递归。xrtFileTouch 排他地创建缺失空文件,或把已有文件的访问和修改时间更新为当前时刻,不截断内容。

临时文件和目录

xrtFileDeleteOpen(File, path) 为受管理临时文件提供不在成功路径申请内存的删除入口。 它不消费或关闭 File,调用者仍须关闭句柄。Windows 按打开对象标记最后关闭时删除, 即使名称被改动也不会按旧路径误删替代对象;POSIX 使用 path 并先核对设备号/inode, 不存在视为已删除、已被替换则报 STATE。POSIX 核对与 unlink 不是原子操作,调用者须 保证临时目录/该名称不被并发替换。虚拟句柄不支持。系统权限、共享冲突等删除失败 仍会报告错误;析构中的自动清理只能是 best-effort,不是无条件删除承诺。

两项 API 都把安全随机命名和系统排他创建合成一个操作,不暴露“先生成不存在路径,再由调用方创建”的竞态窗口。每个候选名称包含 64 位安全随机值;只有系统明确报告名称已存在时才重试,其他权限、路径、内存或熵源错误立即原样返回。公开 API 的目录为空指针时使用系统临时目录,空字符串目录是参数错误。

前后缀为空指针时,临时文件默认使用 .xrt- 和 .tmp,临时目录默认使用 .xrt-dir- 和空后缀。显式空字符串表示不添加该片段。片段不能包含路径分隔符;Windows 还拒绝控制字符、保留名称字符、数据流分隔符以及会被系统折叠的末尾点或空格。它们只控制末级名称,不允许改变目标目录。

xrtFileTemp 成功返回读写文件,并通过 pPath 返回拥有路径;POSIX 以 0600 创建。调用方分别负责 xrtClose、xrtFileDelete 和 xrtFree。xrtDirTemp 成功返回拥有路径;POSIX 以 0700 创建,调用方负责 xrtDirRemove 和 xrtFree。Windows 文件和目录安全描述符继承父目录 ACL,因此应用仍应选择权限合适的父目录。两项 API 都不会自动删除对象,也不会把路径寿命绑定到句柄。

整文件

xrtFileReadAll 按打开时取得的大小精确分配初始缓冲,并适应读取期间增长的文件;空文件只分配结尾字节,不再预留固定 4K。返回值是拥有缓冲,有效数据后总有一个额外零字节,但该字节不计入 *pSize,二进制内容仍必须按长度使用。失败时大小输出为零。

xrtFileReadAllLimit 在同一读取契约上增加硬字节上限。打开时已知大小超限会在分配前失败;读取期间增长越过上限也会在扩容前失败,错误码为 XFILE_ERROR_LIMIT。iLimit=0 只允许空文件。这是读取上传内容、配置或其他不可信文件时的首选入口。

xrtFileWriteAll 创建或截断并完整写入,失败可能留下部分目标。xrtFileAppend 使用系统追加打开语义。xrtFileWriteAtomic 在目标同目录排他创建临时文件,完整写入并 xrtFlush 后原子替换目标;失败会清理临时文件。新文件按 0666 + umask 创建;替换已有 POSIX 普通文件时保留其模式,Windows 使用 ReplaceFileW 保留原目标可合并的 ACL、属性和文件系统元数据。链接、目录和特殊对象不是原子写目标。它保证普通读者不会看到半份新内容,但不承诺所有 POSIX ACL、扩展属性或父目录项已经完成断电持久化。

xrtFileCopy 和 xrtFileMove 都只接受末级路径本身为普通文件的源与目标,不跟随末级符号链接或 Windows 重解析点;移动目录、链接等文件系统条目应使用 xrtPathRename,跨卷链接和目录使用对应模块构建策略。复制使用固定大小栈缓冲流式写入目标同目录临时文件,完成后一次发布,不会按源大小分配复制缓冲。新目标按 0666 + umask 创建,不再继承内部私有临时文件的 0600,但默认不复制时间、POSIX 模式、ACL 或扩展元数据。xrtFileMove 优先改名,只在系统明确报告跨卷时复制成功后删除源文件。删除源失败时目标已经完整存在,错误会明确保留该状态。

文本文件

文本 API 的内存表示固定为 UTF-8,不把编码状态塞进文件句柄。读取 XENCODING_UNKNOWN 时先识别 BOM,再用严格检测选择 UTF-8、UTF-16 或 UTF-32;无法可靠确定时失败,不按本地代码页猜测。显式编码允许有或没有匹配 BOM,BOM 不进入返回文本。

xrtFileReadTextLimit 的 iLimit 限制源文件字节数,文件增长越过上限也会失败;xrtFileReadText 是不施加业务上限的便捷入口。Policy 使用字符集模块的严格、替换等策略。返回字符串由调用方释放,pSize 是 UTF-8 字节数。

合法 UTF-8 文件直接复用整文件读取所得的拥有缓冲,BOM 在原位移除;写入 UTF-8 且不要求 BOM 时直接使用调用方借用视图。其他编码和非法 UTF-8 的替换策略才进入转码器。bWriteBom 控制是否输出对应 BOM。普通写可能留下部分文件,原子版本复用 xrtFileWriteAtomic。

流式字符、行和格式化读写不进入 xfile。后续缓冲流和文本读取器会在同一二进制原语上提供这些能力,避免文件句柄同时维护隐藏编码、缓冲和游标状态。

目录枚举

XDIR_STAT 为每项补全元数据,可能增加一次系统查询;零标志优先使用枚举器已有信息。XDIR_FOLLOW_LINKS 只在补充元数据时跟随末级链接,并且必须与 XDIR_STAT 同时使用。目录迭代器的根路径本身会跟随末级链接。默认跳过 . 和 ..,XDIR_INCLUDE_DOTS 可显式包含。

Name、名称后的零字节和条目元数据都借用迭代器,只在下一次 xrtDirNext 或关闭前有效。Windows 复用每个迭代器按需增长的 UTF-8 名称缓冲,不再为每个条目分配一次;POSIX 直接借用 readdir 名称。POSIX 原始文件名可能不是 UTF-8,只有 XDIR_ENTRY_UTF8 置位时才能交给 Unicode 文本 API。

xrtDirNext 使用三态结果明确区分条目、正常结束和错误;失败不修改输出,发生错误后的迭代器只能关闭。迭代器不是并发对象,不允许多个线程同时读取或关闭;重新开始枚举应关闭后再次打开。xrtDirPath 返回迭代器借用的根路径。xrtDirEntryPath 拼接并返回拥有路径。

目录基础操作

单级创建要求目标不存在;递归创建允许已经存在的目录,但拒绝中途出现非目录对象。默认模式为 0777 并受 POSIX umask 影响,已有目录的模式不会被修改。递归创建不是事务:后续组件失败时,已经创建的前缀目录会保留;它也会经过已有的中间链接,处理不可信相对路径应使用目录根能力。xrtDirRemove 只删除空目录。xrtDirEmpty 成功才修改输出。

xrtDirRoots 在 Windows 返回当前可枚举驱动器根,在 POSIX 返回 /。成功前不修改输出;调用方应传入未持有旧列表的结构。结构、数组和每个字符串都由调用方通过 xrtDirRootsFree 一次释放;释放函数可接受零初始化结构并在完成后清零。

深度优先遍历

每个目录产生 ENTER 和 LEAVE,文件、未跟随链接和特殊对象产生 ITEM。目录只在 ENTER 时计入统计。Path 是完整路径,Parent 和 Name 是其中借用的父目录与末级名称视图,三者只在当前回调期间有效;跟随链接时 Info 描述有效目标,XWALK_ENTRY_LINK 保留物理入口原本是链接这一事实。

XWALK_SKIP 只允许从 ENTER 返回,跳过当前目录内容但仍产生 LEAVE。STOP 是成功早停并设置 Stats.Stopped;此时尚未产生的 LEAVE 不再补发。ERROR 要求回调先设置结构化错误;无错误失败会转换成遍历内部错误。无效控制值会被拒绝。

默认不跟随链接、允许跨文件系统、深度无限并在首个系统错误处终止。MaxDepth=0 只访问根。回调为空时只统计。成功才写入 pStats;统计溢出返回错误,不静默回绕。

OnError 接收发生错误的准确路径和借用错误。XWALK_ERROR_ABORT 终止并保留原错误;回调也可以先设置另一结构化错误来替换它。XWALK_ERROR_SKIP 跳过失败条目,目录枚举失败时跳过该目录剩余内容;XWALK_ERROR_STOP 成功早停。跳过的未解析条目不计入统计。回调返回后路径和错误立即失效,错误动作非法会成为 XWALK_ERROR_CALLBACK。只有 I/O、缺失、类型变化、权限、暂时不可用和平台不支持等路径环境错误进入该回调;内存不足、溢出、参数、状态和内部错误始终终止,不能被误吞。

跟随链接时使用目录身份检测祖先环,环目录仍产生带 CYCLE 标志的 ENTER/LEAVE,但不会下降。ONE_FILESYSTEM 对跨设备目录做同样处理并设置 CROSS_FILESYSTEM。平台无法提供稳定目录身份时,这两种安全模式返回不支持,而不是在未知状态继续。遍历使用显式堆栈,不消耗与目录深度成正比的 C 调用栈;条目顺序保持系统枚举顺序,不为排序缓存整个目录。

链接和 FIFO

符号链接目标可以不存在,并按传入文本存储;Windows 创建链接时必须通过 bDirectory 提供目标类别提示。xrtLinkRead 返回拥有的零结尾目标文本,不把相对目标改写成绝对路径。xrtLinkDelete 只删除链接自身。硬链接要求已有普通文件,链接关系受文件系统限制。

xrtFifoCreate 在 POSIX 调用 mkfifo,路径必须尚不存在,模式只允许低 12 位且仍受 umask 影响;Windows 明确返回 XERR_UNSUPPORTED。FIFO 的打开、阻塞和 IO 直接使用文件原语及系统语义,创建函数本身不打开 FIFO,也不隐藏可能阻塞的打开行为。

目录能力

xroot 持有已经打开的真实目录句柄。xrtRootOpen 允许初始根路径自身经过系统链接解析;成功后,后续操作都相对于已锚定句柄进行,不再用字符串拼接回到原路径。目录在外部被改名后,根对象仍指向同一个目录。xrtRootOpenIn 使用同一安全解析器创建更窄的子根;路径为 . 时仍返回拥有独立原生句柄的新对象。

xrtRootPath 返回创建对象时保存的只读诊断文本,生命周期借用到关闭,不参与安全判断,也不保证在目录改名后更新。xrtRootNative 返回借用的 Windows HANDLE 或 POSIX 文件描述符;所有权仍属于根对象。成功或失败的 xrtRootClose 都会销毁对象,不能重试或继续使用。普通根内操作可以从多个线程并发调用,但关闭、原生句柄操作和其他根操作不得并发。

根内路径必须是非空相对 UTF-8 路径。重复分隔符和 . 会规范化;a/../b 可以回到根内上级,任何试图越过根的 .. 都返回 XERR_PERMISSION。绝对路径、Windows 卷路径、UNC 路径、设备名、备用数据流、控制字符和不适合 Win32 文件名的末尾点或空格会在系统调用前拒绝。末尾分隔符保留“必须是目录”的约束,包括链接替换路径后。

中间目录始终以“不跟随链接”方式逐段打开。遇到符号链接时,解析器读取系统实际跟随的目标,把相对目标重新放入剩余路径,并从根句柄重新开始;绝对目标和越界目标拒绝。末级文件默认可以跟随安全的相对链接,XFILE_NOFOLLOW 禁止跟随。CREATE | EXCLUSIVE 遇到已有链接必须失败,不能通过链接创建或截断目标。链接解析最多八次、总解析步骤最多 255 次,循环或异常深度返回限制错误。

xrtRootFileOpen 与 xrtFileOpen 使用完全相同的选项和 xfile 所有权。xrtRootStat 的 bFollowLink=false 查询链接自身,true 只跟随仍在根内的目标,成功才修改输出。xrtRootDirCreate 只创建末级目录,不隐式创建父级;模式在 POSIX 受 umask 影响,Windows 接受但忽略。xrtRootRemove 删除非目录对象或空目录,绝不跟随末级链接,也拒绝删除根对象自身。xrtRootLinkRead 返回拥有的链接目标原文,调用方使用 xrtFree 释放。

Windows 使用根句柄加 NtCreateFile 的 RootDirectory 逐段解析,并拒绝未知重解析点;POSIX 使用 openat、fstatat、mkdirat、unlinkat 和 readlinkat,每个遍历步骤启用 O_NOFOLLOW。该契约防止普通路径和链接交换把操作带出根目录,但不承诺隔离拥有系统特权的对手,也不阻止管理员通过挂载、绑定挂载、卷管理或原生句柄直接改变可见文件系统。需要进程级安全边界时仍应结合操作系统沙箱、权限和独立身份。

目录树

默认要求目标不存在、保留符号链接文本并拒绝特殊对象。MERGE 允许目标目录已经存在;REPLACE 只与 MERGE 一起使用,并替换冲突文件、目录或链接。未设置 REPLACE 时任何冲突立即失败。

FOLLOW_LINKS 与 SKIP_LINKS 互斥。跟随模式复制有效目标并使用遍历身份检测目录环;跳过模式不在目标创建对应条目。ONE_FILESYSTEM 不下降到其他设备。SKIP_SPECIAL 忽略 FIFO、socket 和设备等不能普通复制的对象。

METADATA 在复制内容后应用通用时间以及 POSIX 模式或部分 Windows 可写属性。它不保留 ACL、所有者、扩展属性、备用数据流、稀疏布局和硬链接关系。需要这些能力时,使用 xrtFileWalk、xrtPathStat、xrtLinkHard 与平台原生接口构建策略,不需要修改目录树核心。

复制在创建目标前同时检查词法路径、对象身份和解析链接后的最近现存父级,拒绝目标等于源或物理上位于源目录内部。Windows 物理路径使用 UTF-16 序数、不区分大小写且按组件边界比较,不把 \\?\ 设备路径错误地交给普通相对路径算法。源根本身是链接时,只有 FOLLOW_LINKS 才允许复制。

目标原本不存在时,复制在同一父目录排他创建私有兄弟暂存树,完整成功后用不替换改名一次性发布。并发创建最终目标的一方会使发布失败,但不会被清理逻辑误删;失败会尽力清理 XRT 自己的暂存树并保留原始错误,持续内存或系统故障仍可能留下名称以 .xrt-tree- 开头的私有暂存目录。合并到既有目录失败时不回滚已经成功发布的条目。只有复制和最终发布都成功才写入 pStats。

xrtDirCopy 是常用封装:bReplace=false 使用默认严格复制,true 使用 MERGE | REPLACE。

递归删除按后序执行且不跟随链接,显式拒绝完整文件系统根。xrtDirRemoveAll 删除根,xrtDirClean 保留根。删除中途失败不会恢复已经删除的对象。

xrtDirMove 优先同卷原子改名。目标已存在且允许替换时执行合并复制后删除源,因此不是原子目录替换;跨卷或平台缺少目录排他改名时也采用复制后删除。复制成功但删除源失败时两端可能同时存在。

xrtDirStats 非递归模式统计根和直接子项,递归模式统计完整树;xrtDirSize 只累计普通文件字节。xrtDirEnsureEmpty 创建缺失目录,或清空已有目录;同名非目录对象返回类型错误。

高级复制可以显式组合策略并取得完整统计:

常用目录管理不需要构造选项:

需要保留删除统计时直接使用 xrtFileTreeRemove:

异步边界

file_async 在有界任务池上提供绝对偏移读写、大小、调整、刷新和可等待关闭。它没有给每个同步路径 Helper 机械增加一个版本;异步整文件、目录管理和遍历仍按独立裁剪层建设。同步与异步路径共享同一打开标志、64 位偏移、所有权和结构化错误语义。

旧版资产处理

新版保留了旧文件体系中已经验证的 64 位定位、二进制 IO、整文件操作、目录枚举、系统根目录枚举、复制移动、链接、FIFO 和目录树能力,并迁移旧测试中的根目录、枚举结束、输出边界和平台分支。旧版 test_file_rootfs.h 验证的是驱动器或 / 的系统根枚举,这一资产已经进入 xrtDirRoots;它不是句柄锚定的目录能力,因此没有被错误包装成新的 xroot 实现。旧版 xrtPathRandom 的前后缀使用手感进入临时对象 API,但“查询路径不存在后再返回”的竞态契约被排他创建替代;旧原子写和大小写改名中的临时路径调用点也统一复用这一份实现。

以下旧设计被有证据地退役:文件句柄内保存文本编码、公开句柄内部字段、静态空字符串失败哨兵、魔法 EOF 返回值、重复的文本/二进制函数族,以及内部失败后仍返回不可信计数。旧中英文文档存在签名和语义漂移,本文件与公共头文件共同作为新版本权威契约。

完整示例

  • examples/file/basic/main.c:打开、完整读写、定位和元数据。
  • examples/file/lock/main.c:非阻塞排他文件锁。
  • examples/file/map/main.c:只读文件映射。
  • examples/file/temp/main.c:安全临时文件创建、使用和清理。
  • examples/file/whole/main.c:整文件、原子写、复制和移动。
  • examples/file/text/main.c:编码检测、UTF-8 文本和 BOM。
  • examples/file/directory/main.c:目录创建、枚举、空目录和系统根。
  • examples/file/dir_temp/main.c:安全临时目录创建和清理。
  • examples/file/walk/main.c:深度限制、回调控制和统计。
  • examples/file/link/main.c:符号链接读取、删除和硬链接。
  • examples/file/root/main.c:锚定目录、打开子根和处理不可信相对路径。
  • examples/file/tree/main.c:目录树复制、统计和递归清理。
  • examples/file/fifo/main.c:POSIX FIFO 创建及 Windows 不支持分支。

xrooterror类型

目录根模块稳定错误代码。

值语义
XROOT_ERROR_OPEN失败
XROOT_ERROR_CLOSE失败
XROOT_ERROR_RESOLVE失败
XROOT_ERROR_ESCAPE失败
XROOT_ERROR_LIMIT超限
XROOT_ERROR_FILE失败
XROOT_ERROR_STAT失败
XROOT_ERROR_CREATE创建
XROOT_ERROR_REMOVE失败
XROOT_ERROR_LINK链接解析失败
typedef enum xrooterror { XROOT_ERROR_OPEN = 1, XROOT_ERROR_CLOSE, XROOT_ERROR_RESOLVE, XROOT_ERROR_ESCAPE, XROOT_ERROR_LIMIT, XROOT_ERROR_FILE, XROOT_ERROR_STAT, XROOT_ERROR_CREATE, XROOT_ERROR_REMOVE, XROOT_ERROR_LINK } xrooterror;

xfileflag类型

打开标志允许组合;至少指定 READ 或 WRITE。

值语义
XFILE_READ读方向
XFILE_WRITE写方向
XFILE_CREATE创建
XFILE_TRUNCATE创建时截断
XFILE_APPEND追加
XFILE_EXCLUSIVE独占创建
XFILE_NOFOLLOW不跟随符号链接
XFILE_SYNC落盘方式
XFILE_ASYNC异步标志
typedef enum xfileflag { XFILE_READ = 0x0001, XFILE_WRITE = 0x0002, XFILE_CREATE = 0x0004, XFILE_TRUNCATE = 0x0008, XFILE_APPEND = 0x0010, XFILE_EXCLUSIVE = 0x0020, XFILE_NOFOLLOW = 0x0040, XFILE_SYNC = 0x0080, /* 为完成式异步 I/O 打开;普通 Read/Write API 不接受该对象。 */ XFILE_ASYNC = 0x0100 } xfileflag;

xfileshare类型

Windows 共享策略;POSIX 接受这些字段但没有对应打开限制。

值语义
XFILE_SHARE_READ读方向
XFILE_SHARE_WRITE写方向
XFILE_SHARE_DELETEDELETE 方法
XFILE_SHARE_ALL共享全部(读+写+删除)
typedef enum xfileshare { XFILE_SHARE_READ = 0x01, XFILE_SHARE_WRITE = 0x02, XFILE_SHARE_DELETE = 0x04, XFILE_SHARE_ALL = 0x07 } xfileshare;

xfileoptions类型

高级打开选项;Mode 只使用 POSIX 权限低 12 位。

字段类型语义
Flagsuint32标志位
Modeuint32模式
Shareuint32Share
typedef struct xfileoptions { uint32 Flags; uint32 Mode; uint32 Share; } xfileoptions;

xfiletype类型

跨平台稳定的文件对象类别。

值语义
XFILE_TYPE_NONE无
XFILE_TYPE_FILE普通文件
XFILE_TYPE_DIRECTORY目录
XFILE_TYPE_LINK符号链接
XFILE_TYPE_FIFOFIFO 管道
XFILE_TYPE_SOCKET套接字
XFILE_TYPE_DEVICE设备文件
XFILE_TYPE_OTHER其他(设备/管道等)
typedef enum xfiletype { XFILE_TYPE_NONE = 0, XFILE_TYPE_FILE, XFILE_TYPE_DIRECTORY, XFILE_TYPE_LINK, XFILE_TYPE_FIFO, XFILE_TYPE_SOCKET, XFILE_TYPE_DEVICE, XFILE_TYPE_OTHER } xfiletype;

xfileinfoflag类型

元数据可用位避免用零伪装平台不提供的时间或身份。

值语义
XFILE_INFO_SIZE尺寸
XFILE_INFO_MODE权限与类型位
XFILE_INFO_ACCESS_TIMEACCESS时间
XFILE_INFO_MODIFY_TIMEMODIFY时间
XFILE_INFO_CREATE_TIME创建时间
XFILE_INFO_CHANGE_TIMECHANGE时间
XFILE_INFO_IDENTITY文件标识(设备+inode)
XFILE_INFO_LINK_COUNT硬链接数
typedef enum xfileinfoflag { XFILE_INFO_SIZE = 0x0001, XFILE_INFO_MODE = 0x0002, XFILE_INFO_ACCESS_TIME = 0x0004, XFILE_INFO_MODIFY_TIME = 0x0008, XFILE_INFO_CREATE_TIME = 0x0010, XFILE_INFO_CHANGE_TIME = 0x0020, XFILE_INFO_IDENTITY = 0x0040, XFILE_INFO_LINK_COUNT = 0x0080 } xfileinfoflag;

xfileinfo类型

文件元数据时间统一使用 公元 UTC 毫秒。

字段类型语义
Typexfiletype类型
Availableuint32Available
Modeuint32模式
Attributesuint32Attributes
Sizeuint64字节数
Deviceuint64Device
Identityuint64Identity
LinkCountuint64LinkCount
AccessedxtimeAccessed
ModifiedxtimeModified
CreatedxtimeCreated
ChangedxtimeChanged
typedef struct xfileinfo { xfiletype Type; uint32 Available; uint32 Mode; uint32 Attributes; uint64 Size; uint64 Device; uint64 Identity; uint64 LinkCount; xtime Accessed; xtime Modified; xtime Created; xtime Changed; } xfileinfo;

xfileerror类型

文件模块稳定错误代码。

值语义
XFILE_ERROR_OPEN失败
XFILE_ERROR_READ读方向
XFILE_ERROR_WRITE写方向
XFILE_ERROR_SEEK失败
XFILE_ERROR_STAT失败
XFILE_ERROR_RESIZE失败
XFILE_ERROR_SYNC失败
XFILE_ERROR_CLOSE失败
XFILE_ERROR_EOF失败
XFILE_ERROR_COPY失败
XFILE_ERROR_MOVE失败
XFILE_ERROR_DELETEDelete失败
XFILE_ERROR_TEMP失败
XFILE_ERROR_METADATA失败
XFILE_ERROR_TOUCH失败
XFILE_ERROR_TEXT文本
XFILE_ERROR_LIMIT超限
XFILE_ERROR_LOCK失败
XFILE_ERROR_MAP内存映射失败
typedef enum xfileerror { XFILE_ERROR_OPEN = 1, XFILE_ERROR_READ, XFILE_ERROR_WRITE, XFILE_ERROR_SEEK, XFILE_ERROR_STAT, XFILE_ERROR_RESIZE, XFILE_ERROR_SYNC, XFILE_ERROR_CLOSE, XFILE_ERROR_EOF, XFILE_ERROR_COPY, XFILE_ERROR_MOVE, XFILE_ERROR_DELETE, XFILE_ERROR_TEMP, XFILE_ERROR_METADATA, XFILE_ERROR_TOUCH, XFILE_ERROR_TEXT, XFILE_ERROR_LIMIT, XFILE_ERROR_LOCK, XFILE_ERROR_MAP } xfileerror;

xfilelock类型

文件锁支持共享读和排他写两种跨进程模式。

值语义
XFILE_LOCK_SHARED共享锁
XFILE_LOCK_EXCLUSIVE独占创建
typedef enum xfilelock { XFILE_LOCK_SHARED = 1, XFILE_LOCK_EXCLUSIVE } xfilelock;

xfilemapflag类型

映射始终可读,可选择共享写或私有写,两种写模式不能同时启用。

值语义
XFILE_MAP_READ读方向
XFILE_MAP_WRITE写方向
XFILE_MAP_COPY写时复制映射
typedef enum xfilemapflag { XFILE_MAP_READ = 0x01, XFILE_MAP_WRITE = 0x02, XFILE_MAP_COPY = 0x04 } xfilemapflag;

xdirflag类型

完整元数据可能增加每个条目一次系统查询,默认只返回枚举器已有信息。

值语义
XDIR_STATstat 信息
XDIR_FOLLOW_LINKS跟随符号链接
XDIR_INCLUDE_DOTS包含 . 与 .. 项
typedef enum xdirflag { XDIR_STAT = 0x01, XDIR_FOLLOW_LINKS = 0x02, XDIR_INCLUDE_DOTS = 0x04 } xdirflag;

xdirnext类型

目录迭代结果明确区分条目、正常结束和失败。

值语义
XDIR_NEXT_ERROR失败
XDIR_NEXT_ENDEND
XDIR_NEXT_ITEM已产出条目
typedef enum xdirnext { XDIR_NEXT_ERROR = -1, XDIR_NEXT_END = 0, XDIR_NEXT_ITEM = 1 } xdirnext;

xdirentryflag类型

POSIX 文件名允许原始字节;该标志表示名称已经通过严格 UTF-8 检查。

值语义
XDIR_ENTRY_UTF8名称为 UTF-8
typedef enum xdirentryflag { XDIR_ENTRY_UTF8 = 0x01 } xdirentryflag;

xdirentry类型

名称和元数据借用到下一次迭代或关闭;Name 始终额外带零结尾。

字段类型语义
Namexstrview名称
Infoxfileinfo信息输出
Flagsuint32标志位
typedef struct xdirentry { xstrview Name; xfileinfo Info; uint32 Flags; } xdirentry;

xdirroots类型

系统根目录列表拥有每个字符串以及指针数组。

字段类型语义
Itemsstr*元素数组
Countsize_t数量
typedef struct xdirroots { str* Items; size_t Count; } xdirroots;

xdirerror类型

目录模块稳定错误代码。

值语义
XDIR_ERROR_OPEN失败
XDIR_ERROR_NEXT失败
XDIR_ERROR_CLOSE失败
XDIR_ERROR_CREATE创建
XDIR_ERROR_REMOVE失败
XDIR_ERROR_ROOTS失败
XDIR_ERROR_ENTRY失败
XDIR_ERROR_TEMP临时路径不可用
typedef enum xdirerror { XDIR_ERROR_OPEN = 1, XDIR_ERROR_NEXT, XDIR_ERROR_CLOSE, XDIR_ERROR_CREATE, XDIR_ERROR_REMOVE, XDIR_ERROR_ROOTS, XDIR_ERROR_ENTRY, XDIR_ERROR_TEMP } xdirerror;

xtreecopyflag类型

目录树复制默认要求目标不存在并保留符号链接。

值语义
XTREE_COPY_MERGEMERGE
XTREE_COPY_REPLACEREPLACE
XTREE_COPY_FOLLOW_LINKSFOLLOWLINKS
XTREE_COPY_SKIP_LINKS跳过LINKS
XTREE_COPY_ONE_FILESYSTEMONEFILESYSTEM
XTREE_COPY_SKIP_SPECIAL跳过SPECIAL
XTREE_COPY_METADATA复制元数据
typedef enum xtreecopyflag { XTREE_COPY_MERGE = 0x01, XTREE_COPY_REPLACE = 0x02, XTREE_COPY_FOLLOW_LINKS = 0x04, XTREE_COPY_SKIP_LINKS = 0x08, XTREE_COPY_ONE_FILESYSTEM = 0x10, XTREE_COPY_SKIP_SPECIAL = 0x20, XTREE_COPY_METADATA = 0x40 } xtreecopyflag;

xtreecopyoptions类型

高级目录树复制选项。

字段类型语义
Flagsuint32标志位
typedef struct xtreecopyoptions { uint32 Flags; } xtreecopyoptions;

xtreeerror类型

目录树模块稳定错误代码。

值语义
XTREE_ERROR_OPTIONSOptions失败
XTREE_ERROR_SOURCE源码位置
XTREE_ERROR_TARGET失败
XTREE_ERROR_DESCENDANT失败
XTREE_ERROR_LINK_CYCLE失败
XTREE_ERROR_SPECIAL失败
XTREE_ERROR_ROOT根操作非法
typedef enum xtreeerror { XTREE_ERROR_OPTIONS = 1, XTREE_ERROR_SOURCE, XTREE_ERROR_TARGET, XTREE_ERROR_DESCENDANT, XTREE_ERROR_LINK_CYCLE, XTREE_ERROR_SPECIAL, XTREE_ERROR_ROOT } xtreeerror;

xlinkerror类型

链接模块稳定错误代码。

值语义
XLINK_ERROR_CREATE创建
XLINK_ERROR_READ读方向
XLINK_ERROR_DELETEDelete失败
XLINK_ERROR_FORMAT链接格式非法
typedef enum xlinkerror { XLINK_ERROR_CREATE = 1, XLINK_ERROR_READ, XLINK_ERROR_DELETE, XLINK_ERROR_FORMAT } xlinkerror;

xfifoerror类型

FIFO 模块稳定错误代码。

值语义
XFIFO_ERROR_CREATE管道创建失败
typedef enum xfifoerror { XFIFO_ERROR_CREATE = 1 } xfifoerror;

xwalkflag类型

遍历默认不跟随链接,可选择限制在根文件系统内。

值语义
XWALK_FOLLOW_LINKSXWALKFOLLOWLINKS
XWALK_ONE_FILESYSTEM限制在根文件系统内
typedef enum xwalkflag { XWALK_FOLLOW_LINKS = 0x01, XWALK_ONE_FILESYSTEM = 0x02 } xwalkflag;

xwalkevent类型

每个目录产生进入和离开事件,其他对象产生条目事件。

值语义
XWALK_ENTERENTER
XWALK_ITEMITEM
XWALK_LEAVE离开目录
typedef enum xwalkevent { XWALK_ENTER = 1, XWALK_ITEM, XWALK_LEAVE } xwalkevent;

xwalkentryflag类型

条目标志保留物理链接身份以及不能继续下降的原因。

值语义
XWALK_ENTRY_UTF8UTF-8
XWALK_ENTRY_LINKLINK
XWALK_ENTRY_CYCLECYCLE
XWALK_ENTRY_CROSS_FILESYSTEM进入新文件系统
typedef enum xwalkentryflag { XWALK_ENTRY_UTF8 = 0x01, XWALK_ENTRY_LINK = 0x02, XWALK_ENTRY_CYCLE = 0x04, XWALK_ENTRY_CROSS_FILESYSTEM = 0x08 } xwalkentryflag;

xwalkcontrol类型

回调可继续、跳过当前目录、成功停止或报告失败。

值语义
XWALK_CONTINUECONTINUE(100 继续)
XWALK_SKIP跳过
XWALK_STOPSTOP
XWALK_ERROR失败
typedef enum xwalkcontrol { XWALK_CONTINUE = 0, XWALK_SKIP, XWALK_STOP, XWALK_ERROR } xwalkcontrol;

xwalkerroraction类型

遍历系统错误可终止、跳过当前路径,或成功停止。

值语义
XWALK_ERROR_ABORT失败
XWALK_ERROR_SKIP跳过
XWALK_ERROR_STOP停止
typedef enum xwalkerroraction { XWALK_ERROR_ABORT = 0, XWALK_ERROR_SKIP, XWALK_ERROR_STOP } xwalkerroraction;

xwalkoptions类型

遍历选项为空时等价于不跟随链接且深度无限。

字段类型语义
Flagsuint32标志位
MaxDepthsize_tMaxDepth
OnErrorxwalkerrorprocOnError
typedef struct xwalkoptions { uint32 Flags; size_t MaxDepth; xwalkerrorproc OnError; } xwalkoptions;

xwalkentry类型

Path、Parent 和 Name 只在回调期间借用,Info 在跟随链接时描述目标。

字段类型语义
Pathcstr路径
ParentxstrviewParent
Namexstrview名称
Infoxfileinfo信息输出
EventxwalkeventEvent
Flagsuint32标志位
Depthsize_tDepth
typedef struct xwalkentry { cstr Path; xstrview Parent; xstrview Name; xfileinfo Info; xwalkevent Event; uint32 Flags; size_t Depth; } xwalkentry;

xwalkstats类型

遍历统计按对象计数,目录只在进入时计一次。

字段类型语义
Itemsuint64元素数组
Filesuint64Files
Directoriesuint64Directories
Linksuint64Links
Othersuint64Others
Bytesuint64Bytes
StoppedboolStopped
typedef struct xwalkstats { uint64 Items; uint64 Files; uint64 Directories; uint64 Links; uint64 Others; uint64 Bytes; bool Stopped; } xwalkstats;

xwalkerror类型

遍历模块稳定错误代码。

值语义
XWALK_ERROR_OPTIONSOptions失败
XWALK_ERROR_CALLBACK回调失败
XWALK_ERROR_IDENTITY失败
XWALK_ERROR_OVERFLOW深度超限
typedef enum xwalkerror { XWALK_ERROR_OPTIONS = 1, XWALK_ERROR_CALLBACK, XWALK_ERROR_IDENTITY, XWALK_ERROR_OVERFLOW } xwalkerror;

xwalkerrorproc类型

错误和路径只在回调期间借用;用户数据与条目回调共用。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xwalkerroraction(*xwalkerrorproc)(cstr sPath, const xerror* pError, ptr pUserData)

xwalkproc类型

遍历回调不拥有条目,返回错误时应先设置结构化错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xwalkcontrol(*xwalkproc)(const xwalkentry* pEntry, ptr pUserData)
文件打开

xrtFileOptionsInit函数

初始化文件打开选项为零值(默认权限与共享策略)。

void xrtFileOptionsInit(xfileoptions* pOptions)

参数

参数方向约束说明
pOptions输出非空接收默认选项
返回值
返回含义失败时状态
无纯初始化,不失败—
错误
  • 无 — 初始化不失败

范例已编译验证

file/io_tour · 选项打开 · 观察

	(void)xrtFileOptionsInit(&Options);

xrtFileOpen函数

使用完整选项(标志/权限/共享/临时语义)打开文件。 路径转换和文件对象分配在系统打开调用前完成;这些内存分配失败时,不创建新文件, 也不截断已有文件。该保证同样适用于 xrtOpen、xrtFileTemp 和 xrtRootFileOpen 的对象分配路径。 这不是任意系统错误的文件事务承诺;需保护已有内容的高层写入仍应采用临时文件提交。

xfile xrtFileOpen(cstr sPath, const xfileoptions* pOptions)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
pOptions输入允许空空 = 仅默认标志
返回值
返回含义失败时状态
非空打开的文件对象—
NULL打开失败系统错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 选项打开 · 观察

	File = xrtFileOpen(sPath, &Options);

xrtOpen函数

使用默认权限和共享策略按标志打开文件的便捷入口。

xfile xrtOpen(cstr sPath, uint32 iFlags)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
iFlags输入XFILE_* 组合打开标志(READ/WRITE/CREATE/TRUNCATE/APPEND 等)
返回值
返回含义失败时状态
非空打开的文件对象—
NULL打开失败系统错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 一次创建 · 观察

	xfile File = xrtOpen("xrt-file-example.tmp",
		XFILE_READ | XFILE_WRITE | XFILE_CREATE | XFILE_TRUNCATE);
二进制 IO

xrtClose函数

关闭并销毁文件对象;即使系统关闭失败也不再允许使用该对象。

bool xrtClose(xfile File)

参数

参数方向约束说明
File输入允许空打开的文件对象;空 = 空操作
返回值
返回含义失败时状态
true已关闭并释放—
false系统关闭失败(对象仍被销毁)系统错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 收尾 · 观察

	if ( !xrtClose(File) ) {
		return 1;
	}

xrtRead函数

单次读取,成功读取零字节表示 EOF。

bool xrtRead(xfile File, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
File输入非空文件对象
pBuffer输出非空接收缓冲
iRequest输入—请求字节数
pRead输出可空实际读取量(可为 0 = EOF)
返回值
返回含义失败时状态
true已读取(可能短读)—
false参数或系统错误*pRead 语义不定
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 单次读写 · 观察

	if ( !xrtRead(File, Buffer, sizeof(Buffer), &iDone) || (iDone != 4u) ) {

xrtWrite函数

单次写入,允许成功短写。

bool xrtWrite(xfile File, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
File输入非空文件对象
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空实际写入量
返回值
返回含义失败时状态
true已写入(可能短写)—
false参数或系统错误*pWritten 语义不定
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 单次读写 · 观察

	if ( !xrtWrite(File, "abcd", 4u, &iDone) || (iDone != 4u) ) {

xrtReadFull函数

持续读取到填满缓冲;提前 EOF 返回失败并保留实际读取量。

bool xrtReadFull(xfile File, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
File输入非空文件对象
pBuffer输出非空接收缓冲
iRequest输入—请求字节数
pRead输出可空实际读取量(失败时保留)
返回值
返回含义失败时状态
true缓冲已填满—
false提前 EOF 或系统错误*pRead 保留已读量
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 完整读取 · 观察

		 !xrtReadFull(File, arrText, sizeof(arrText), NULL) ) {

xrtWriteFull函数

持续写入到全部完成;失败时保留实际写入量。

bool xrtWriteFull(xfile File, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
File输入非空文件对象
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空实际写入量(失败时保留)
返回值
返回含义失败时状态
true全部写入完成—
false系统错误*pWritten 保留已写量
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 一次创建 · 观察

	if ( !xrtWriteFull(File, sText, sizeof(sText), NULL) ||

xrtReadAt函数

从绝对偏移单次读取,不改变共享文件游标。

bool xrtReadAt(xfile File, uint64 iOffset, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入—绝对偏移
pBuffer输出非空接收缓冲
iRequest输入—请求字节数
pRead输出可空实际读取量
返回值
返回含义失败时状态
true已读取(可能短读)—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 定位读写 · 观察

	if ( !xrtReadAt(File, 0u, Buffer, 4u, &iDone) || (iDone != 4u) ) {

xrtWriteAt函数

向绝对偏移单次写入,不改变共享文件游标。

bool xrtWriteAt(xfile File, uint64 iOffset, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入—绝对偏移
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空实际写入量
返回值
返回含义失败时状态
true已写入(可能短写)—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 定位读写 · 观察

	(void)xrtWriteAt(File, 0u, "AB", 2u, NULL);

xrtReadAtFull函数

从绝对偏移持续读取到填满缓冲;预读文件头不扰动流式游标。

bool xrtReadAtFull(xfile File, uint64 iOffset, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入—绝对偏移
pBuffer输出非空接收缓冲
iRequest输入—请求字节数
pRead输出可空实际读取量(失败时保留)
返回值
返回含义失败时状态
true缓冲已填满—
false提前 EOF 或系统错误*pRead 保留已读量
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 预读 · 观察

		 !xrtReadAtFull(File, 0, arrText, sizeof(arrText), NULL) ||

xrtWriteAtFull函数

向绝对偏移持续写入到全部完成。

bool xrtWriteAtFull(xfile File, uint64 iOffset, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入—绝对偏移
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空实际写入量(失败时保留)
返回值
返回含义失败时状态
true全部写入完成—
false系统错误*pWritten 保留已写量
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 定位读写 · 观察

	if ( !xrtWriteAtFull(File, 4u, "efgh", 4u, NULL) ) {
定位和大小

xrtSeek函数

按 64 位偏移移动共享文件游标。

bool xrtSeek(xfile File, int64 iOffset, xseek Origin, uint64* pPosition)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入可负偏移量
Origin输入XSEEK_START/CURRENT/END偏移基准
pPosition输出可空接收新游标位置
返回值
返回含义失败时状态
true游标已移动—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 游标 · 观察

		 !xrtSeek(File, 3, XSEEK_START, NULL) ||

xrtTell函数

返回共享文件游标位置。

bool xrtTell(xfile File, uint64* pPosition)

参数

参数方向约束说明
File输入非空文件对象
pPosition输出非空接收游标位置
返回值
返回含义失败时状态
true位置已写出—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 游标 · 观察

		 !xrtTell(File, &iPosition) || (iPosition != 3u) ||

xrtFlush函数

把文件数据和必要元数据提交到稳定存储。

bool xrtFlush(xfile File)

参数

参数方向约束说明
File输入非空文件对象
返回值
返回含义失败时状态
true已提交稳定存储—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 单次读写 · 观察

	if ( !xrtFlush(File) ) {

xrtFileSize函数

返回打开对象当前大小。

bool xrtFileSize(xfile File, uint64* pSize)

参数

参数方向约束说明
File输入非空文件对象
pSize输出非空接收字节数
返回值
返回含义失败时状态
true大小已写出—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 元数据 · 观察

	if ( !xrtFileSize(File, &iSize) || (iSize != 8u) ) {

xrtFileResize函数

修改打开文件的大小(截断或扩展,扩展区为零填充)。

bool xrtFileResize(xfile File, uint64 iSize)

参数

参数方向约束说明
File输入非空文件对象
iSize输入—新大小
返回值
返回含义失败时状态
true大小已修改—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 截断 · 观察

	if ( !xrtFileResize(File, 4u) || !xrtFileSize(File, &iSize) ||

xrtFileSetSize函数

打开路径并修改普通文件大小,文件必须已经存在。

bool xrtFileSetSize(cstr sPath, uint64 iSize)

参数

参数方向约束说明
sPath输入非空、UTF-8已存在的文件路径
iSize输入—新大小
返回值
返回含义失败时状态
true大小已修改—
false路径不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 截断 · 观察

if ( !xrtFileSetSize(sPath, 2u) ) {
		goto cleanup;
	}
文件锁

xrtFileLock函数

锁定整个文件;bWait 决定冲突时阻塞或立即失败。

bool xrtFileLock(xfile File, xfilelock Mode, bool bWait)

参数

参数方向约束说明
File输入非空文件对象
Mode输入XFILE_LOCK_SHARED/EXCLUSIVE锁模式
bWait输入—冲突时是否阻塞等待
返回值
返回含义失败时状态
true已取得锁—
false冲突(非阻塞)或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_AGAIN — 非阻塞模式遇冲突(如实现设置)

范例已编译验证

file/lock · 全文件锁 · 观察

	if ( !xrtFileLock(File, XFILE_LOCK_EXCLUSIVE, false) ) {

xrtFileUnlock函数

解除整个文件锁。

bool xrtFileUnlock(xfile File)

参数

参数方向约束说明
File输入非空已上锁的文件对象
返回值
返回含义失败时状态
true已解锁—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/lock · 全文件锁 · 观察

	if ( !xrtFileUnlock(File) || !xrtClose(File) ) {

xrtFileLockRange函数

锁定字节区间;iSize 为零表示从偏移到文件末端及后续增长。

bool xrtFileLockRange(xfile File, xfilelock Mode, uint64 iOffset, uint64 iSize, bool bWait)

参数

参数方向约束说明
File输入非空文件对象
Mode输入—共享或排他
iOffset输入—区间起点
iSize输入零 = 到末端区间长度
bWait输入—冲突阻塞
返回值
返回含义失败时状态
true区间锁已取得—
false冲突或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 区间锁 · 观察

	if ( !xrtFileLockRange(File, XFILE_LOCK_SHARED, 0u, 4u, true) ) {

xrtFileUnlockRange函数

解除完全相同的字节区间锁(参数必须与加锁时逐项一致)。

bool xrtFileUnlockRange(xfile File, uint64 iOffset, uint64 iSize)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入与加锁一致区间起点
iSize输入与加锁一致区间长度
返回值
返回含义失败时状态
true已解锁—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 区间锁 · 观察

	if ( !xrtFileUnlockRange(File, 0u, 4u) ) {
文件映射

xrtFileMap函数

映射文件区间;iSize 为零表示映射到当前文件末端。

xfilemap xrtFileMap(xfile File, uint64 iOffset, size_t iSize, uint32 iFlags)

参数

参数方向约束说明
File输入非空文件对象
iOffset输入—映射起点
iSize输入零 = 到末端映射长度
iFlags输入XFILE_MAP_READ/WRITE访问模式
返回值
返回含义失败时状态
非空映射对象—
NULL系统错误错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/map · 只读映射 · 观察

	Map = xrtFileMap(File, 0u, 0u, XFILE_MAP_READ);

xrtFileMapData函数

返回借用的映射数据;空映射返回空指针。

ptr xrtFileMapData(xfilemap Map)

参数

参数方向约束说明
Map输入非空映射对象
返回值
返回含义失败时状态
非空映射首字节(借用,随 Unmap 失效)—
NULL空映射或参数非法—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/map · 只读映射 · 观察

		printf("%.*s\n", (int)xrtFileMapSize(Map),
			(const char*)xrtFileMapData(Map));

xrtFileMapSize函数

返回调用方可访问的映射字节数。

size_t xrtFileMapSize(xfilemap Map)

参数

参数方向约束说明
Map输入非空映射对象
返回值
返回含义失败时状态
>= 0可访问字节数—
0空映射或参数非法—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/map · 只读映射 · 观察

		printf("%.*s\n", (int)xrtFileMapSize(Map),

xrtFileMapFlush函数

把共享写映射的指定区间提交给操作系统。

bool xrtFileMapFlush(xfilemap Map, size_t iOffset, size_t iSize)

参数

参数方向约束说明
Map输入非空共享写映射
iOffset输入—区间起点
iSize输入零 = 全部区间长度
返回值
返回含义失败时状态
true已提交—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 映射提交 · 观察

	printf(" map-flush=%d\n", xrtFileMapFlush(Map, 0u, 0u) ? 1 : 0);

xrtFileUnmap函数

解除映射并销毁映射对象。

bool xrtFileUnmap(xfilemap Map)

参数

参数方向约束说明
Map输入允许空空 = 空操作
返回值
返回含义失败时状态
true已解除并释放—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/map · 收尾 · 观察

		if ( xrtFileUnmap(Map) && xrtClose(File) &&
元数据

xrtFileFlags函数

返回打开文件经过验证的标志;失败返回 0。

uint32 xrtFileFlags(xfile File)

参数

参数方向约束说明
File输入非空文件对象
返回值
返回含义失败时状态
XFILE_* 组合打开时的标志—
0对象非法系统错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 自省 · 观察

	iFlags = xrtFileFlags(File);

xrtFileNative函数

返回 HANDLE 或文件描述符的整数表示;失败返回 -1。调用方不得关闭它。

intptr_t xrtFileNative(xfile File)

参数

参数方向约束说明
File输入非空文件对象
返回值
返回含义失败时状态
>= 0平台原生句柄(借用,随 Close 失效)—
-1对象非法系统错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 自省 · 观察

		intptr_t Native = xrtFileNative(File);

xrtFileStat函数

查询打开文件的元数据。

bool xrtFileStat(xfile File, xfileinfo* pInfo)

参数

参数方向约束说明
File输入非空文件对象
pInfo输出非空接收大小/时间/属性快照
返回值
返回含义失败时状态
true快照已写出—
false参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · 元数据 · 观察

	if ( !xrtFileStat(File, &Info) || (Info.Size != 8u) ) {

xrtFileExists函数

判断路径是否存在且为普通文件。

bool xrtFileExists(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
true存在普通文件—
false不存在或查询失败(区分二者用 xrtPathStat)—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 清理 · 观察

	if ( xrtFileExists(sSource) && !xrtFileDelete(sSource) ) {

xrtFileTouch函数

创建空文件;已存在文件刷新时间戳。

bool xrtFileTouch(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
true已创建或时间戳已刷新—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/io_tour · Touch · 观察

	(void)xrtFileTouch(sPath);

xrtFileDelete函数

删除普通文件或空目录占位的文件路径。

bool xrtFileDelete(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
true已删除—
false不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/basic · 清理 · 观察

	return xrtFileDelete("xrt-file-example.tmp") ? 0 : 1;

xrtPathRename函数

重命名路径;bReplace 控制目标已存在时是否替换。

bool xrtPathRename(cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
sSource输入非空、UTF-8源路径
sTarget输入非空目标路径
bReplace输入—替换已存在目标
返回值
返回含义失败时状态
true已重命名—
false目标存在且不替换,或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link_tour · 重命名 · 观察

	if ( !xrtPathRename(sOrigin, sRenamed, false) ) {

xrtFileCopy函数

流式复制普通文件;不跟随末级链接,bReplace 控制是否替换普通文件目标。

bool xrtFileCopy(cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
sSource输入非空源文件
sTarget输入非空目标路径
bReplace输入—替换已存在的普通文件
返回值
返回含义失败时状态
true已复制—
false目标存在且不替换,或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 复制移动 · 观察

		 !xrtFileCopy(sSource, sCopy, false) ||

xrtFileMove函数

移动普通文件;优先改名,跨卷时复制成功后删除源文件。

bool xrtFileMove(cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
sSource输入非空源文件
sTarget输入非空目标路径
bReplace输入—替换已存在的普通文件
返回值
返回含义失败时状态
true已移动—
false目标存在且不替换,或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 复制移动 · 观察

		 !xrtFileMove(sCopy, sMoved, false) ) {

xrtPathStat函数

查询路径元数据;bFollowLink 决定是否跟随末级符号链接。

bool xrtPathStat(cstr sPath, bool bFollowLink, xfileinfo* pInfo)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
bFollowLink输入—跟随末级符号链接
pInfo输出非空接收元数据快照
返回值
返回含义失败时状态
true快照已写出—
false不存在或系统错误区分二者靠错误码
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND — 路径不存在

范例已编译验证

file/link · 硬链接 · 观察

		 !xrtPathStat(sLink, true, &Info) ) {

xrtPathExists函数

判断任意路径是否存在(文件/目录/链接均算存在)。

bool xrtPathExists(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
true存在某种对象—
false不存在或查询失败(区分用 xrtPathStat)—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link_tour · 存在性 · 观察

	printf("exists=%d", xrtPathExists(sOrigin) ? 1 : 0);

xrtPathSetTimes函数

设置访问和修改时间;空指针表示保留对应时间,至少设置一项。

bool xrtPathSetTimes(cstr sPath, bool bFollowLink, const xtime* pAccessed, const xtime* pModified)

参数

参数方向约束说明
sPath输入非空路径
bFollowLink输入—跟随末级链接
pAccessed输入可空新访问时间
pModified输入可空新修改时间
返回值
返回含义失败时状态
true时间已更新—
false两项全空或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link_tour · 时间戳 · 观察

	printf("times=%d", xrtPathSetTimes(sRenamed, true, &iNow, &iNow) ? 1 : 0);

xrtPathSetMode函数

设置 POSIX 权限模式;Windows 明确返回不支持。

bool xrtPathSetMode(cstr sPath, bool bFollowLink, uint32 iMode)

参数

参数方向约束说明
sPath输入非空路径
bFollowLink输入—跟随末级链接
iMode输入八进制位POSIX 权限
返回值
返回含义失败时状态
true模式已设置—
falseWindows 上必然失败XERR_UNSUPPORTED(Windows)
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_UNSUPPORTED — Windows 平台

范例已编译验证

file/link_tour · 平台差异 · 观察

	if ( xrtPathSetMode(sRenamed, true, 0600u) ) {

xrtPathSetAttributes函数

设置 Windows 原生属性;POSIX 明确返回不支持。

bool xrtPathSetAttributes(cstr sPath, uint32 iAttributes)

参数

参数方向约束说明
sPath输入非空路径
iAttributes输入FILE_ATTRIBUTE_*Windows 原生属性
返回值
返回含义失败时状态
true属性已设置—
falsePOSIX 上必然失败XERR_UNSUPPORTED(POSIX)
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_UNSUPPORTED — POSIX 平台

范例已编译验证

file/link_tour · 平台差异 · 观察

	} else if ( xrtPathSetAttributes(sRenamed, 0u) ) {
临时文件和目录

xrtFileTemp函数

排他创建临时文件并返回拥有路径;目录为空指针时使用系统临时目录。

xfile xrtFileTemp(cstr sDirectory, cstr sPrefix, cstr sSuffix, str* pPath)

参数

参数方向约束说明
sDirectory输入可空父目录;空 = 系统临时目录
sPrefix输入可空文件名前缀
sSuffix输入可空文件名后缀
pPath输出非空接收拥有路径(xrtFree 释放)
返回值
返回含义失败时状态
非空排他打开的临时文件—
NULL创建失败;*pPath 未定义错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_EXISTS — 唯一名重试耗尽(罕见)

范例已编译验证

file/temp · 临时文件 · 观察

	xfile File = xrtFileTemp(NULL, "xrt-example-", ".tmp", &sPath);

xrtDirTemp函数

排他创建临时目录并返回拥有路径;目录为空指针时使用系统临时目录。

str xrtDirTemp(cstr sDirectory, cstr sPrefix, cstr sSuffix)

参数

参数方向约束说明
sDirectory输入可空父目录;空 = 系统临时目录
sPrefix输入可空目录名前缀
sSuffix输入可空目录名后缀
返回值
返回含义失败时状态
非空拥有路径(xrtFree 释放)—
NULL创建失败错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_temp · 临时目录 · 观察

	str sPath = xrtDirTemp(NULL, "xrt-example-dir-", NULL);
整文件

xrtFileReadAll函数

读取完整文件;结果总有一个额外零字节,空文件也返回可释放缓冲。

bytes xrtFileReadAll(cstr sPath, size_t* pSize)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
pSize输出可空接收字节数(不含零哨兵)
返回值
返回含义失败时状态
非空完整内容 + 零哨兵,xrtFree 释放—
NULL系统错误或 OOM错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_MEMORY — 分配失败

范例已编译验证

file/whole · 整读 · 观察

	pData = xrtFileReadAll(sMoved, &iSize);
	if ( pData == NULL ) {
		goto cleanup;
	}

xrtFileReadAllLimit函数

在硬上限内读取完整文件;增长越过上限时失败。

bytes xrtFileReadAllLimit(cstr sPath, size_t iLimit, size_t* pSize)

参数

参数方向约束说明
sPath输入非空路径
iLimit输入—源文件字节硬上限
pSize输出可空接收字节数
返回值
返回含义失败时状态
非空上限内的完整内容 + 零哨兵—
NULL超上限或失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_RANGE — 文件越过上限
  • XERR_MEMORY — 分配失败

范例已编译验证

file/io_tour · 带上限整读 · 观察

bytes pAll = xrtFileReadAllLimit(sPath, 16u, &iDone);

xrtFileWriteAll函数

创建或截断文件并完整写入全部字节。

bool xrtFileWriteAll(cstr sPath, xbytesview Data)

参数

参数方向约束说明
sPath输入非空路径
Data输入借用完整内容
返回值
返回含义失败时状态
true已完整写入—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 整写 · 观察

	if ( !xrtFileWriteAll(sSource, XRT_BYTES_LITERAL("first")) ||

xrtFileAppend函数

使用操作系统追加语义完整写入全部字节。

bool xrtFileAppend(cstr sPath, xbytesview Data)

参数

参数方向约束说明
sPath输入非空路径(不存在则创建)
Data输入借用追加内容
返回值
返回含义失败时状态
true已追加—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 追加 · 观察

		 !xrtFileAppend(sSource, XRT_BYTES_LITERAL(" second")) ||

xrtFileWriteAtomic函数

在同目录完整写入排他临时文件,再原子替换目标;读者永远见不到半个文件。

bool xrtFileWriteAtomic(cstr sPath, xbytesview Data)

参数

参数方向约束说明
sPath输入非空目标路径
Data输入借用完整内容
返回值
返回含义失败时状态
true已原子发布—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/whole · 原子替换 · 观察

		 !xrtFileWriteAtomic(sSource, XRT_BYTES_LITERAL("published")) ||
文本文件

xrtFileReadText函数

读取并转换为 UTF-8;UNKNOWN 根据 BOM 和严格检测选择 Unicode 编码。

str xrtFileReadText(cstr sPath, xencoding Encoding, xutfpolicy Policy, size_t* pSize)

参数

参数方向约束说明
sPath输入非空路径
Encoding输入—源编码;XENCODING_UNKNOWN 自动探测
Policy输入—严格或替换
pSize输出可空接收 UTF-8 字节数
返回值
返回含义失败时状态
非空UTF-8 文本 + 零结尾,xrtFree 释放—
NULL编码错误或失败错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • xrt.charset 域错误 — 非法序列(严格模式)
  • XERR_MEMORY

范例已编译验证

file/text · 读回 · 观察

	sText = xrtFileReadText(sPath, XENCODING_UNKNOWN, XUTF_STRICT, &iSize);

xrtFileReadTextLimit函数

在源文件字节硬上限内读取并转换为 UTF-8。

str xrtFileReadTextLimit(cstr sPath, xencoding Encoding, xutfpolicy Policy, size_t iLimit, size_t* pSize)

参数

参数方向约束说明
sPath输入非空路径
Encoding输入—源编码
Policy输入—错误策略
iLimit输入—源文件字节硬上限
pSize输出可空UTF-8 字节数
返回值
返回含义失败时状态
非空上限内的 UTF-8 文本—
NULL超上限或失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_RANGE — 源文件越过上限
  • xrt.charset 域错误 — 严格模式非法序列

范例已编译验证

file/report · 限额读回 · 观察

	sReadBack = xrtFileReadTextLimit(
		sFilePath, XENCODING_UTF8, XUTF_STRICT, 4096u, &iReadSize
	);

xrtFileWriteText函数

把 UTF-8 文本转换为目标编码后完整写入。

bool xrtFileWriteText(cstr sPath, xstrview Text, xencoding Encoding, xutfpolicy Policy, bool bWriteBom)

参数

参数方向约束说明
sPath输入非空路径
Text输入借用、UTF-8文本
Encoding输入—目标编码
Policy输入—错误策略
bWriteBom输入—是否写 BOM
返回值
返回含义失败时状态
true已转换并写入—
false编码错误或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • xrt.charset 域错误 — UTF-8 源非法或目标不可表示

范例已编译验证

file/text · 按编码写 · 观察

	if ( !xrtFileWriteText(sPath, XRT_STR_LITERAL("Hello, XRT"),

xrtFileWriteTextAtomic函数

把 UTF-8 文本转换后原子替换目标。

bool xrtFileWriteTextAtomic(cstr sPath, xstrview Text, xencoding Encoding, xutfpolicy Policy, bool bWriteBom)

参数

参数方向约束说明
sPath输入非空目标路径
Text输入借用、UTF-8文本
Encoding输入—目标编码
Policy输入—错误策略
bWriteBom输入—是否写 BOM
返回值
返回含义失败时状态
true已原子发布—
false编码错误或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • xrt.charset 域错误

范例已编译验证

file/report · 原子发布 · 观察

		 !xrtFileWriteTextAtomic(
			sFilePath,
			(xstrview){ arrReport, (size_t)iReportSize },
			XENCODING_UTF8,
			XUTF_STRICT,
			false
		 ) ) {
目录枚举

xrtDirOpen函数

打开目录迭代器;根路径跟随末级链接,零标志提供无额外 stat 的枚举。

xdir xrtDirOpen(cstr sPath, uint32 iFlags)

参数

参数方向约束说明
sPath输入非空、UTF-8目录路径
iFlags输入零或 XDIR_*枚举选项
返回值
返回含义失败时状态
非空目录迭代器—
NULL打开失败错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/directory · 枚举 · 观察

	xdir Dir = xrtDirOpen(".", 0u);

xrtDirNext函数

读取下一条目录项;失败时不修改输出。

xdirnext xrtDirNext(xdir Dir, xdirentry* pEntry)

参数

参数方向约束说明
Dir输入非空迭代器
pEntry输出非空接收条目(名称借用到下一次调用)
返回值
返回含义失败时状态
XDIR_NEXT_ITEM取得一条—
XDIR_NEXT_END枚举完毕(正常结果)不设置错误
XDIR_NEXT_ERROR系统错误错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/directory · 枚举 · 观察

	while ( (Next = xrtDirNext(Dir, &Entry)) == XDIR_NEXT_ITEM ) {

xrtDirClose函数

关闭并销毁目录迭代器。

bool xrtDirClose(xdir Dir)

参数

参数方向约束说明
Dir输入允许空空 = 空操作
返回值
返回含义失败时状态
true已关闭—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/directory · 枚举 · 观察

	xrtDirClose(Dir);

xrtDirPath函数

返回迭代器借用的目录路径。

cstr xrtDirPath(xdir Dir)

参数

参数方向约束说明
Dir输入非空迭代器
返回值
返回含义失败时状态
cstr借用路径(存活到 Close)—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/dir_tour · 枚举辅助 · 观察

		printf("dir=%s", xrtDirPath(Dir));

xrtDirEntryPath函数

把迭代器目录与条目名称拼成拥有路径。

str xrtDirEntryPath(xdir Dir, const xdirentry* pEntry)

参数

参数方向约束说明
Dir输入非空迭代器
pEntry输入非空目录条目
返回值
返回含义失败时状态
非空拥有路径(xrtFree 释放)—
NULL参数或系统错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 枚举辅助 · 观察

			str sFull = xrtDirEntryPath(Dir, &Entry);
目录基础操作

xrtDirExists函数

判断路径是否存在且为目录。

bool xrtDirExists(cstr sPath)

参数

参数方向约束说明
sPath输入非空路径
返回值
返回含义失败时状态
true存在目录—
false非目录或查询失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/tree · 前置清理 · 观察

	if ( xrtDirExists(sSource) ) {

xrtDirCreate函数

使用平台默认模式创建一个目录。

bool xrtDirCreate(cstr sPath)

参数

参数方向约束说明
sPath输入非空目标路径
返回值
返回含义失败时状态
true已创建—
false已存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_EXISTS — 已存在

范例已编译验证

file/tree · 浅创建 · 观察

	if ( !xrtDirCreate(sSource) ) {

xrtDirCreateMode函数

使用显式 POSIX 模式创建一个目录;Windows 接受但忽略模式。

bool xrtDirCreateMode(cstr sPath, uint32 iMode)

参数

参数方向约束说明
sPath输入非空目标路径
iMode输入八进制位POSIX 权限
返回值
返回含义失败时状态
true已创建—
false已存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_EXISTS

范例已编译验证

file/dir_tour · 创建 · 观察

	if ( !xrtDirCreateMode("xrt-dir-tour/single", 0700u) ) {

xrtDirCreateAll函数

使用平台默认模式递归创建全部缺失目录。

bool xrtDirCreateAll(cstr sPath)

参数

参数方向约束说明
sPath输入非空多级路径
返回值
返回含义失败时状态
true全链已存在或已创建—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 递归建链 · 观察

	if ( !xrtDirCreateAll(sDeep) ) {

xrtDirCreateAllMode函数

使用显式 POSIX 模式递归创建全部缺失目录;失败可能保留已创建前缀。

bool xrtDirCreateAllMode(cstr sPath, uint32 iMode)

参数

参数方向约束说明
sPath输入非空多级路径
iMode输入八进制位POSIX 权限
返回值
返回含义失败时状态
true全链就绪—
false系统错误(已建前缀保留)—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 递归建链 · 观察

	if ( !xrtDirCreateAllMode("xrt-dir-tour/mode/a/b", 0700u) ) {

xrtDirRemove函数

删除一个空目录,不递归删除其内容。

bool xrtDirRemove(cstr sPath)

参数

参数方向约束说明
sPath输入非空目标目录
返回值
返回含义失败时状态
true已删除—
false非空/不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_STATE — 目录非空(如实现设置)

范例已编译验证

file/dir_temp · 收尾 · 观察

	bResult = xrtDirRemove(sPath);

xrtDirRemoveAll函数

递归删除整棵目录树(含根目录)。

bool xrtDirRemoveAll(cstr sPath)

参数

参数方向约束说明
sPath输入非空树根路径
返回值
返回含义失败时状态
true整树已删除—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/tree · 前置清理 · 观察

		(void)xrtDirRemoveAll(sSource);

xrtDirEmpty函数

查询目录是否为空;失败时不修改输出。

bool xrtDirEmpty(cstr sPath, bool* pEmpty)

参数

参数方向约束说明
sPath输入非空目录路径
pEmpty输出非空接收空判定
返回值
返回含义失败时状态
true判定已写出—
false不存在或系统错误*pEmpty 不变
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 观测 · 观察

	if ( !xrtDirEmpty("xrt-dir-tour/single", &bEmpty) || !bEmpty ) {

xrtDirEnsureEmpty函数

确保目录存在且为空:不存在则创建,存在则清空内容但保留目录。

bool xrtDirEnsureEmpty(cstr sPath)

参数

参数方向约束说明
sPath输入非空目录路径
返回值
返回含义失败时状态
true目录存在且为空—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 观测 · 观察

	if ( !xrtDirEnsureEmpty("xrt-dir-tour/fresh") ) {

xrtDirClean函数

删除目录全部内容但保留目录自身。

bool xrtDirClean(cstr sPath)

参数

参数方向约束说明
sPath输入非空目录路径
返回值
返回含义失败时状态
true内容已清空—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 清内容留目录 · 观察

	if ( !xrtDirClean(sDeep) ) {

xrtDirMove函数

移动目录;bReplace 控制目标已存在目录的替换语义。

bool xrtDirMove(cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
sSource输入非空源目录
sTarget输入非空目标路径
bReplace输入—替换已存在目标
返回值
返回含义失败时状态
true已移动—
false目标存在且不替换,或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 移动 · 观察

	if ( !xrtDirMove("xrt-dir-tour/single", "xrt-dir-tour/renamed", false) ) {

xrtDirCopy函数

递归复制目录树;bReplace 控制目标冲突。

bool xrtDirCopy(cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
sSource输入非空源树
sTarget输入非空目标路径
bReplace输入—替换已存在对象
返回值
返回含义失败时状态
true整树已复制—
false冲突或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/tree · 树复制 · 观察

		xrtClose(File) && xrtDirCopy(sSource, sTarget, false) ) {

xrtDirStats函数

统计目录内容:文件数/目录数/字节数;bRecursive 控制是否深入子目录。

bool xrtDirStats(cstr sPath, bool bRecursive, xwalkstats* pStats)

参数

参数方向约束说明
sPath输入非空目录路径
bRecursive输入—深入子目录
pStats输出非空接收统计
返回值
返回含义失败时状态
true统计已写出—
false不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 观测 · 观察

	if ( !xrtDirStats(sDeep, false, &Stats) || (Stats.Files != 1u) ) {

xrtDirSize函数

统计目录总字节数;bRecursive 控制是否深入子目录。

bool xrtDirSize(cstr sPath, bool bRecursive, uint64* pSize)

参数

参数方向约束说明
sPath输入非空目录路径
bRecursive输入—深入子目录
pSize输出非空接收总字节数
返回值
返回含义失败时状态
true总量已写出—
false不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 观测 · 观察

	if ( !xrtDirSize(sDeep, true, &iSize) || (iSize != 7u) ) {

xrtDirRoots函数

查询当前系统可枚举的文件系统根目录。

bool xrtDirRoots(xdirroots* pRoots)

参数

参数方向约束说明
pRoots输出非空接收根列表(Items/Count)
返回值
返回含义失败时状态
true列表已写出(用后 DirRootsFree)—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 根列表 · 观察

	if ( !xrtDirRoots(&Roots) || (Roots.Count < 1u) ) {

xrtDirRootsFree函数

释放系统根目录列表并清零。

void xrtDirRootsFree(xdirroots* pRoots)

参数

参数方向约束说明
pRoots输入允许空DirRoots 产物
返回值
返回含义失败时状态
无列表已释放—
错误
  • 无 — 释放不失败

范例已编译验证

file/dir_tour · 根列表 · 观察

	xrtDirRootsFree(&Roots);
深度优先遍历

xrtWalkOptionsInit函数

初始化遍历选项:不跟随链接、允许跨文件系统、深度无限。

void xrtWalkOptionsInit(xwalkoptions* pOptions)

参数

参数方向约束说明
pOptions输出非空接收默认选项
返回值
返回含义失败时状态
无纯初始化,不失败—
错误
  • 无 — 初始化不失败

范例已编译验证

file/walk · 限深遍历 · 观察

	xrtWalkOptionsInit(&Options);
	Options.MaxDepth = 1u;

xrtFileWalk函数

深度优先遍历一个文件系统对象;回调为空时只计算统计。

bool xrtFileWalk(cstr sPath, const xwalkoptions* pOptions, xwalkproc pProc, ptr pUserData, xwalkstats* pStats)

参数

参数方向约束说明
sPath输入非空、UTF-8遍历起点
pOptions输入允许空空 = 默认选项
pProc输入可空访问回调;返回假中止遍历
pUserData输入任意值原样传给回调
pStats输出可空接收统计
返回值
返回含义失败时状态
true遍历完成(或被回调中止且算成功)—
false起点不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND — 起点不存在

范例已编译验证

file/walk · 限深遍历 · 观察

	if ( !xrtFileWalk(".", &Options, printEntry, NULL, &Stats) ) {
链接和 FIFO

xrtLinkCreate函数

创建符号链接;目标可以不存在,目录提示在 Windows 上是必需信息。

bool xrtLinkCreate(cstr sTarget, cstr sLink, bool bDirectory)

参数

参数方向约束说明
sTarget输入非空链接目标(按原文本保存)
sLink输入非空链接路径
bDirectory输入—目标是否目录(Windows 必需)
返回值
返回含义失败时状态
true链接已创建—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link_tour · 符号链接 · 观察

	if ( !xrtLinkCreate(sRenamed, sLink, false) ) {

xrtLinkHard函数

为已存在文件创建硬链接。

bool xrtLinkHard(cstr sExisting, cstr sLink)

参数

参数方向约束说明
sExisting输入非空已存在的普通文件
sLink输入非空新链接路径
返回值
返回含义失败时状态
true硬链接已创建—
false跨卷/目标存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link · 硬链接 · 观察

		 !xrtClose(File) || !xrtLinkHard(sSource, sLink) ||

xrtLinkRead函数

读取符号链接中存储的目标文本,返回拥有的零结尾路径字节。

str xrtLinkRead(cstr sLink)

参数

参数方向约束说明
sLink输入非空链接路径
返回值
返回含义失败时状态
非空目标文本(xrtFree 释放)—
NULL非链接或系统错误错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND — 链接不存在

范例已编译验证

file/link_tour · 读目标 · 观察

		str sTarget = xrtLinkRead(sLink);

xrtLinkDelete函数

删除符号链接自身,不跟随也不删除目标。

bool xrtLinkDelete(cstr sLink)

参数

参数方向约束说明
sLink输入非空链接路径
返回值
返回含义失败时状态
true链接已删除(目标不受影响)—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/link_tour · 删链接 · 观察

	if ( !xrtLinkDelete(sLink) ) {

xrtFifoCreate函数

创建不存在的 POSIX FIFO;模式只允许低 12 位且仍受 umask 影响,Windows 返回不支持。

bool xrtFifoCreate(cstr sPath, uint32 iMode)

参数

参数方向约束说明
sPath输入非空FIFO 路径
iMode输入低 12 位POSIX 权限(受 umask)
返回值
返回含义失败时状态
trueFIFO 已创建—
falseWindows 必然失败XERR_UNSUPPORTED(Windows)
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_UNSUPPORTED — Windows 平台
  • XERR_EXISTS — 已存在

范例已编译验证

file/fifo · 平台门控 · 观察

		if ( !xrtFifoCreate(sPath, 0600u) &&
			(xrtGetError() != NULL) &&
			(xrtErrorKind(xrtGetError()) == XERR_UNSUPPORTED) ) {
目录能力

xrtRootOpen函数

打开并锚定一个真实目录;根路径自身允许包含链接。

xroot xrtRootOpen(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8根目录路径
返回值
返回含义失败时状态
非空锚定的根对象—
NULL打开失败错误经 xrtGetError() 报告
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/root · 父根与子根 · 观察

	Parent = xrtRootOpen(".");

xrtRootOpenIn函数

在已有根内打开并锚定一个子目录。

xroot xrtRootOpenIn(xroot Root, cstr sPath)

参数

参数方向约束说明
Root输入非空父根
sPath输入非空、根内相对子目录
返回值
返回含义失败时状态
非空子根(父根保持独立)—
NULL越界或打开失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_ARGUMENT — 相对路径越出根外

范例已编译验证

file/root · 父根与子根 · 观察

	Root = xrtRootOpenIn(Parent, sDirectory);

xrtRootClose函数

关闭原生目录句柄并销毁根对象;关闭不得与其他根操作并发。

bool xrtRootClose(xroot Root)

参数

参数方向约束说明
Root输入允许空空 = 空操作
返回值
返回含义失败时状态
true已关闭并释放—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/root · 收尾 · 观察

		 !xrtRootClose(Root) ||

xrtRootPath函数

返回创建根对象时保存的诊断路径,不参与任何安全判断。

cstr xrtRootPath(xroot Root)

参数

参数方向约束说明
Root输入非空根对象
返回值
返回含义失败时状态
cstr借用诊断路径(存活到 Close)—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/root_tour · 自省 · 观察

		xrtRootPath(Root), xrtRootPath(Root),

xrtRootNative函数

返回根目录 HANDLE 或文件描述符的整数表示,所有权仍属于根对象。

intptr_t xrtRootNative(xroot Root)

参数

参数方向约束说明
Root输入非空根对象
返回值
返回含义失败时状态
>= 0原生句柄(借用)—
-1参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/root_tour · 自省 · 观察

		xrtRootNative(Root) != 0 ? 1 : 0);

xrtRootFileOpen函数

在根内使用完整文件选项打开普通文件。 解析路径和预分配文件对象在最后的系统打开前完成;对象分配失败不会创建文件或 截断已有目标。符号链接仍受根目录范围和打开标志约束,不回退到拼接绝对路径。

xfile xrtRootFileOpen(xroot Root, cstr sPath, const xfileoptions* pOptions)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对文件路径
pOptions输入允许空打开选项
返回值
返回含义失败时状态
非空打开的文件—
NULL越界或打开失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_ARGUMENT — 越界路径

范例已编译验证

file/root · 根内文件 · 观察

	File = xrtRootFileOpen(Root, sName, &Options);

xrtRootStat函数

查询根内对象元数据;bFollowLink 决定是否解析末级链接。

bool xrtRootStat(xroot Root, cstr sPath, bool bFollowLink, xfileinfo* pInfo)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对对象路径
bFollowLink输入—解析末级链接
pInfo输出非空接收元数据
返回值
返回含义失败时状态
true快照已写出—
false越界/不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND

范例已编译验证

file/root_tour · 元数据 · 观察

	bOk = xrtRootStat(Root, "xrt-root-tour-target.tmp", true, &Info);

xrtRootDirCreate函数

在根内创建一个目录;POSIX 使用显式模式,Windows 接受但忽略模式。

bool xrtRootDirCreate(xroot Root, cstr sPath, uint32 iMode)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对目录路径
iMode输入八进制位POSIX 权限
返回值
返回含义失败时状态
true已创建—
false越界/已存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_EXISTS

范例已编译验证

file/root · 父根与子根 · 观察

	if ( !xrtRootDirCreate(Parent, sDirectory, 0700u) ) {

xrtRootRemove函数

删除根内一个非目录对象或空目录,不跟随末级链接。

bool xrtRootRemove(xroot Root, cstr sPath)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对目标路径
返回值
返回含义失败时状态
true已删除—
false越界/不存在或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND

范例已编译验证

file/root · 收尾 · 观察

		 !xrtRootRemove(Root, sName) ||

xrtRootLinkRead函数

读取根内末级符号链接或受支持重解析点保存的目标文本。

str xrtRootLinkRead(xroot Root, cstr sPath)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对链接路径
返回值
返回含义失败时状态
非空目标文本(xrtFree 释放)—
NULL非链接或失败—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_NOT_FOUND

范例已编译验证

file/root_tour · 链接族 · 观察

		sTarget = xrtRootLinkRead(Root, "xrt-root-tour-link");

xrtRootLinkCreate函数

在根内创建符号链接;链接目标按原文本保存,链接路径的父目录始终锚定。

bool xrtRootLinkCreate(xroot Root, cstr sTarget, cstr sLink, bool bDirectory)

参数

参数方向约束说明
Root输入非空根对象
sTarget输入非空目标文本(不经根解析)
sLink输入非空、根内相对链接路径
bDirectory输入—目标目录提示(Windows)
返回值
返回含义失败时状态
true链接已创建—
false越界或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/root_tour · 链接族 · 观察

	bOk = xrtRootLinkCreate(Root, "target.txt", "xrt-root-tour-link", false);

xrtRootLinkHard函数

在同一根内为普通文件创建硬链接,源和目标路径都经过根解析。

bool xrtRootLinkHard(xroot Root, cstr sExisting, cstr sLink)

参数

参数方向约束说明
Root输入非空根对象
sExisting输入非空、根内相对已存在文件
sLink输入非空、根内相对新链接
返回值
返回含义失败时状态
true硬链接已创建—
false越界/跨卷或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/root_tour · 链接族 · 观察

	bOk = xrtRootLinkHard(Root, "xrt-root-tour-target.tmp",

xrtRootFifoCreate函数

在根内创建 POSIX FIFO;不支持 FIFO 的平台返回 XERR_UNSUPPORTED。

bool xrtRootFifoCreate(xroot Root, cstr sPath, uint32 iMode)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对FIFO 路径
iMode输入低 12 位POSIX 权限
返回值
返回含义失败时状态
trueFIFO 已创建—
falseWindows 必然失败XERR_UNSUPPORTED(Windows)
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_UNSUPPORTED — Windows

范例已编译验证

file/root_tour · 平台门控 · 观察

	bOk = xrtRootFifoCreate(Root, "xrt-root-tour-fifo", 0600u);

xrtRootSetMode函数

在根内设置 POSIX 对象权限;跟随链接时仍由根解析器阻止越界。 Windows 返回 XERR_UNSUPPORTED,不会以目标存在代替权限设置成功,也不会修改目标属性。

bool xrtRootSetMode(xroot Root, cstr sPath, bool bFollowLink, uint32 iMode)

参数

参数方向约束说明
Root输入非空根对象
sPath输入非空、根内相对对象路径
bFollowLink输入—解析末级链接
iMode输入八进制位POSIX 权限
返回值
返回含义失败时状态
true模式已设置—
falseWindows 必然失败或越界XERR_UNSUPPORTED(Windows)
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_UNSUPPORTED — Windows

范例已编译验证

file/root_tour · 平台门控 · 观察

	bOk = xrtRootSetMode(Root, "xrt-root-tour-target.tmp", true, 0600u);
目录树

xrtTreeCopyOptionsInit函数

初始化树复制选项:目标必须不存在、保留符号链接、拒绝特殊对象。

void xrtTreeCopyOptionsInit(xtreecopyoptions* pOptions)

参数

参数方向约束说明
pOptions输出非空接收默认选项
返回值
返回含义失败时状态
无纯初始化,不失败—
错误
  • 无 — 初始化不失败

范例已编译验证

file/dir_tour · 高级树复制 · 观察

		xrtTreeCopyOptionsInit(&Options);

xrtFileTreeCopy函数

使用高级选项复制目录树,统计成功时返回源树对象数量。

bool xrtFileTreeCopy(cstr sSource, cstr sTarget, const xtreecopyoptions* pOptions, xwalkstats* pStats)

参数

参数方向约束说明
sSource输入非空源树根
sTarget输入非空目标路径(默认须不存在)
pOptions输入允许空空 = 默认保守选项
pStats输出可空接收复制统计
返回值
返回含义失败时状态
true整树已复制—
false目标冲突或系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码
  • XERR_EXISTS — 目标已存在且选项要求不存在

范例已编译验证

file/dir_tour · 高级树复制 · 观察

		if ( !xrtFileTreeCopy(sRoot, "xrt-dir-tour-copy", &Options, &Stats) ||

xrtFileTreeRemove函数

后序删除目录树;bKeepRoot 为真时只清空内容。

bool xrtFileTreeRemove(cstr sPath, bool bKeepRoot, xwalkstats* pStats)

参数

参数方向约束说明
sPath输入非空树根路径
bKeepRoot输入—保留根目录(等价只清空)
pStats输出可空接收删除统计
返回值
返回含义失败时状态
true整树(或内容)已删除—
false系统错误—
错误
  • 系统错误(xrt.io 域)— 平台调用失败,保留原生错误码

范例已编译验证

file/dir_tour · 后序删除 · 观察

	if ( !xrtFileTreeRemove(sRoot, true, &Stats) ) {
补充参考 · 契约见公共头注释

xrtFileCapabilities函数

契约注释见公共头文件。

XRT_API uint64 xrtFileCapabilities(xfile File)

xrtFileDeleteOpen函数

契约注释见公共头文件。

XRT_API bool xrtFileDeleteOpen(xfile File, cstr sPath)

xrtRootDirOpen函数

契约注释见公共头文件。

XRT_API xdir xrtRootDirOpen(xroot Root, cstr sPath, uint32 iFlags)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XDIR_ENTRY_UTF8见头文件注释
XDIR_ERROR_CLOSE见头文件注释
XDIR_ERROR_CREATE见头文件注释
XDIR_ERROR_ENTRY见头文件注释
XDIR_ERROR_NEXT见头文件注释
XDIR_ERROR_OPEN见头文件注释
XDIR_ERROR_REMOVE见头文件注释
XDIR_ERROR_ROOTS见头文件注释
XDIR_ERROR_TEMP见头文件注释
XDIR_FOLLOW_LINKS见头文件注释
XDIR_INCLUDE_DOTS见头文件注释
XDIR_NEXT_END见头文件注释
XDIR_NEXT_ERROR见头文件注释
XDIR_NEXT_ITEM见头文件注释
XDIR_STAT见头文件注释
XFIFO_ERROR_CREATE见头文件注释
XFILE_APPEND见头文件注释
XFILE_ASYNC见头文件注释
XFILE_CAP_ASYNC_BIND见头文件注释
XFILE_CAP_FLUSH见头文件注释
XFILE_CAP_NATIVE见头文件注释
XFILE_CAP_NATIVE_CONTROL见头文件注释
XFILE_CAP_READ见头文件注释
XFILE_CAP_READ_AT见头文件注释
XFILE_CAP_RESIZE见头文件注释
XFILE_CAP_SEEK见头文件注释
XFILE_CAP_STAT见头文件注释
XFILE_CAP_WRITE见头文件注释
XFILE_CAP_WRITE_AT见头文件注释
XFILE_CREATE见头文件注释
XFILE_ERROR_CLOSE见头文件注释
XFILE_ERROR_COPY见头文件注释
XFILE_ERROR_DELETE见头文件注释
XFILE_ERROR_EOF见头文件注释
XFILE_ERROR_LIMIT见头文件注释
XFILE_ERROR_LOCK见头文件注释
XFILE_ERROR_MAP见头文件注释
XFILE_ERROR_METADATA见头文件注释
XFILE_ERROR_MOVE见头文件注释
XFILE_ERROR_OPEN见头文件注释
XFILE_ERROR_READ见头文件注释
XFILE_ERROR_RESIZE见头文件注释
XFILE_ERROR_SEEK见头文件注释
XFILE_ERROR_STAT见头文件注释
XFILE_ERROR_SYNC见头文件注释
XFILE_ERROR_TEMP见头文件注释
XFILE_ERROR_TEXT见头文件注释
XFILE_ERROR_TOUCH见头文件注释
XFILE_ERROR_WRITE见头文件注释
XFILE_EXCLUSIVE见头文件注释
XFILE_INFO_ACCESS_TIME见头文件注释
XFILE_INFO_CHANGE_TIME见头文件注释
XFILE_INFO_CREATE_TIME见头文件注释
XFILE_INFO_IDENTITY见头文件注释
XFILE_INFO_LINK_COUNT见头文件注释
XFILE_INFO_MODE见头文件注释
XFILE_INFO_MODIFY_TIME见头文件注释
XFILE_INFO_SIZE见头文件注释
XFILE_LOCK_EXCLUSIVE见头文件注释
XFILE_LOCK_SHARED见头文件注释
XFILE_MAP_COPY见头文件注释
XFILE_MAP_READ见头文件注释
XFILE_MAP_WRITE见头文件注释
XFILE_NOFOLLOW见头文件注释
XFILE_READ见头文件注释
XFILE_SHARE_ALL见头文件注释
XFILE_SHARE_DELETE见头文件注释
XFILE_SHARE_READ见头文件注释
XFILE_SHARE_WRITE见头文件注释
XFILE_SYNC见头文件注释
XFILE_TRUNCATE见头文件注释
XFILE_TYPE_DEVICE见头文件注释
XFILE_TYPE_DIRECTORY见头文件注释
XFILE_TYPE_FIFO见头文件注释
XFILE_TYPE_FILE见头文件注释
XFILE_TYPE_LINK见头文件注释
XFILE_TYPE_NONE见头文件注释
XFILE_TYPE_OTHER见头文件注释
XFILE_TYPE_SOCKET见头文件注释
XFILE_WRITE见头文件注释
XLINK_ERROR_CREATE见头文件注释
XLINK_ERROR_DELETE见头文件注释
XLINK_ERROR_FORMAT见头文件注释
XLINK_ERROR_READ见头文件注释
XROOT_ERROR_CLOSE见头文件注释
XROOT_ERROR_CREATE见头文件注释
XROOT_ERROR_ESCAPE见头文件注释
XROOT_ERROR_FILE见头文件注释
XROOT_ERROR_LIMIT见头文件注释
XROOT_ERROR_LINK见头文件注释
XROOT_ERROR_OPEN见头文件注释
XROOT_ERROR_REMOVE见头文件注释
XROOT_ERROR_RESOLVE见头文件注释
XROOT_ERROR_STAT见头文件注释
XTREE_COPY_FOLLOW_LINKS见头文件注释
XTREE_COPY_MERGE见头文件注释
XTREE_COPY_METADATA见头文件注释
XTREE_COPY_ONE_FILESYSTEM见头文件注释
XTREE_COPY_REPLACE见头文件注释
XTREE_COPY_SKIP_LINKS见头文件注释
XTREE_COPY_SKIP_SPECIAL见头文件注释
XTREE_ERROR_DESCENDANT见头文件注释
XTREE_ERROR_LINK_CYCLE见头文件注释
XTREE_ERROR_OPTIONS见头文件注释
XTREE_ERROR_ROOT见头文件注释
XTREE_ERROR_SOURCE见头文件注释
XTREE_ERROR_SPECIAL见头文件注释
XTREE_ERROR_TARGET见头文件注释
XWALK_CONTINUE见头文件注释
XWALK_ENTER见头文件注释
XWALK_ENTRY_CROSS_FILESYSTEM见头文件注释
XWALK_ENTRY_CYCLE见头文件注释
XWALK_ENTRY_LINK见头文件注释
XWALK_ENTRY_UTF8见头文件注释
XWALK_ERROR见头文件注释
XWALK_ERROR_ABORT见头文件注释
XWALK_ERROR_CALLBACK见头文件注释
XWALK_ERROR_IDENTITY见头文件注释
XWALK_ERROR_OPTIONS见头文件注释
XWALK_ERROR_OVERFLOW见头文件注释
XWALK_ERROR_SKIP见头文件注释
XWALK_ERROR_STOP见头文件注释
XWALK_FOLLOW_LINKS见头文件注释
XWALK_ITEM见头文件注释
XWALK_LEAVE见头文件注释
XWALK_ONE_FILESYSTEM见头文件注释
XWALK_SKIP见头文件注释
XWALK_STOP见头文件注释