模块契约异步文件

错误

异步文件错误域为 xrt.file.async,稳定代码由 xfileasyncerror 定义:

  • OPEN、SUBMIT、READ、WRITE、FLUSH、SIZE、RESIZE、CLOSE
  • COPY、MOVE、DELETE、CREATE、TREE、QUERY

同步参数、范围、溢出和受理前 OOM 直接返回 NULL 并设置线程错误。任务已受理后的失败保存在 Future 中,通过 xrtFutureError 读取。外层错误保留操作语义,底层 xrt.file、xrt.dir、xrt.tree 或任务池错误保存在 xrtErrorCause 中。

裁剪与依赖

功能按真实依赖拆分,应用只启用需要的层:

  • XRT_FEATURE_FILE_ASYNC_COMMON:任务提交、路径快照和结构化错误公共层,只依赖 task_pool。
  • XRT_FEATURE_FILE_ASYNC:已打开文件的绝对偏移读写、大小、调整、刷新和关闭,只依赖 file 与公共层。
  • XRT_FEATURE_FILE_ASYNC_WHOLE:整文件读取、覆盖、追加和原子写,只依赖 file_whole 与公共层。
  • XRT_FEATURE_FILE_ASYNC_MANAGE:文件复制、移动和删除,只依赖 file_whole 与公共层。
  • XRT_FEATURE_DIR_ASYNC:目录创建、递归创建、空目录删除和空状态查询,只依赖 dir 与公共层。
  • XRT_FEATURE_FILE_TREE_ASYNC:目录树复制、移动、删除、清理、统计和大小,只依赖 file_tree 与公共层。

旧版把这些能力放在一个路径任务大分派器和全局线程体系中。当前实现保留其完整场景,但每一层直接复用已经验证的同步底座,避免重复平台代码,也允许基础目录异步操作不引入递归遍历、链接和整文件复制。

任务池

所有异步入口显式接收 xtaskpool*:

任务池必须存活到全部 Future 完成。队列达到硬上限时,提交同步返回 NULL,错误域为 xrt.file.async、代码为 XFILE_ASYNC_ERROR_SUBMIT,其 cause 保留任务池的 XERR_AGAIN。调用方可以等待负载下降后重试。

路径、复制型写入数据和目录树选项都在提交返回前取得快照。提交成功后,调用方可以立即修改或释放原始参数。

文件对象

xrtAsyncFileOpen 同步完成参数校验和原生文件打开。XFILE_APPEND 与绝对偏移写入语义冲突,因此文件对象拒绝该标志;追加写入使用 xrtFileAppendAsync。

已经打开的文件可以转交给异步对象:

Adopt 成功后接管唯一关闭责任,失败时所有权仍归调用方。xrtAsyncFileFlags 返回采用时冻结的文件标志。

调用 Close 后,调用方立即失去 xasyncfile* 所有权。关闭 Future 在全部已受理操作终止且原生文件关闭后完成。关闭使用任务池的资源回收通道,不占普通队列槽位,因此队列已满或任务池已关闭接收普通任务时仍能收尾。

定位读写

xrtAsyncFileWriteAt 复制输入。成功值是 Future 拥有的 xfilechange,其中 Offset 是请求偏移,Size 是完整写入字节数。

高吞吐场景可避免复制:

  • xrtAsyncFileWriteAtRef 借用外部缓冲。提交成功后,释放回调在成功、失败或取消终态后执行一次;提交失败不转移所有权。
  • xrtAsyncFileWriteAtTake 接管由 xrtMalloc 家族分配的缓冲,并在终态后通过 xrtFree 释放;提交失败仍由调用方释放。
  • 零长度写入不转移外部缓冲所有权。

读取成功值 xfiledata 及其 Data 都由 Future 拥有:

  • Offset:请求的绝对偏移。
  • Size:实际读取字节数。
  • End:非零请求发生短读,即本次到达 EOF。
  • Data[Size]:额外补零,便于协议检查;数据仍按二进制长度处理。

零长度读取不探测 EOF,返回 Size == 0、End == false。

Windows 使用 OVERLAPPED 定位 I/O,POSIX 使用 pread/pwrite。同一文件对象的不同绝对偏移操作可以并行,不共享也不修改文件游标。任务池只保证受理和终态,不保证相关任务的执行顺序;存在数据依赖时,调用方必须等待前一个 Future,或使用 Future continuation 后再提交下一步。

大小与刷新

  • xrtAsyncFileSize 返回 Future 拥有的 xfilesize。
  • xrtAsyncFileResize 返回 Future 拥有的 xfilechange,其 Size 是新大小。
  • xrtAsyncFileFlush 把可写文件提交到稳定存储;只读文件为成功空操作。

整文件

整文件层提供:

  • xrtFileReadAllAsync 与 xrtFileReadAllLimitAsync,成功值为 xfiledata。
  • xrtFileWriteAllAsync,完整覆盖文件。
  • xrtFileAppendAsync,使用操作系统追加语义完整写入。
  • xrtFileWriteAtomicAsync,在同目录写入私有临时文件后原子发布。

三种写入都复制调用方数据,成功值为 xfilechange。受限读取会在已知或增长后的文件大小越过硬上限时失败。

文件管理

xrtFileCopyAsync、xrtFileMoveAsync 和 xrtFileDeleteAsync 与同步底座共享替换、跨卷移动和错误语义。成功 Future 没有值。

目录

基础目录层提供 xrtDirCreateAsync、xrtDirCreateModeAsync、xrtDirCreateAllAsync、xrtDirCreateAllModeAsync 和 xrtDirRemoveAsync。模式参数在 Windows 上被接受但忽略,在 POSIX 上使用权限低 12 位。

xrtDirEmptyAsync 成功值为 Future 拥有的 xdirquery,通过 Empty 判断目录是否为空。

目录树

递归目录树层直接复用同步层的 xtreecopyoptions 与 xwalkstats:

  • xrtFileTreeCopyAsync:高级复制,成功值是源树统计。
  • xrtDirCopyAsync:常用复制,bReplace 为真时合并目录并替换冲突对象。
  • xrtFileTreeRemoveAsync:高级后序删除,成功值是处理统计。
  • xrtDirRemoveAllAsync 与 xrtDirCleanAsync:删除根或只清空内容。
  • xrtDirMoveAsync:优先同卷改名,跨卷时复制成功后删除源树。
  • xrtDirStatsAsync:返回 xwalkstats。
  • xrtDirSizeAsync:返回 xfilesize。
  • xrtDirEnsureEmptyAsync:创建缺失目录,或清空已有目录。

复制、删除和统计结果由 Future 拥有。移动和确保为空成功时没有值。

取消

取消是协作请求:

  • 排队任务在开始前观察到取消时进入 XFUTURE_CANCELLED,任务参数和外部缓冲责任完整回收。
  • 已进入阻塞文件系统调用的任务通常要等待该调用返回,不承诺强制中断。
  • 取消 Future 不等于关闭 xasyncfile;对象仍须通过 xrtAsyncFileClose 收尾。

示例

  • examples/file/async/main.c
  • examples/file/async_whole/main.c
  • examples/file/async_manage/main.c
  • examples/file/dir_async/main.c
  • examples/file/tree_async/main.c

xfiledata类型

读取结果及其 Data 都由 Future 拥有,Future 释放前保持有效。

字段类型语义
Databytes数据
Sizesize_t字节数
Offsetuint64偏移量
Endbool结束
typedef struct xfiledata { bytes Data; size_t Size; uint64 Offset; bool End; } xfiledata;

xfilechange类型

写入、查询大小和修改大小统一返回偏移与字节数。

字段类型语义
Offsetuint64偏移量
Sizeuint64字节数
typedef struct xfilechange { uint64 Offset; uint64 Size; } xfilechange;

xfilesize类型

文件或目录树大小查询使用独立结果,避免混入写入偏移语义。

字段类型语义
Sizeuint64字节数
typedef struct xfilesize { uint64 Size; } xfilesize;

xdirquery类型

目录属性查询结果由 Future 拥有。

字段类型语义
EmptyboolEmpty
typedef struct xdirquery { bool Empty; } xdirquery;

xfileasyncerror类型

异步文件错误保留外层操作,并通过 cause 保留文件或任务池错误。

值语义
XFILE_ASYNC_ERROR_OPEN失败
XFILE_ASYNC_ERROR_SUBMIT失败
XFILE_ASYNC_ERROR_READ读方向
XFILE_ASYNC_ERROR_WRITE写方向
XFILE_ASYNC_ERROR_FLUSH刷新
XFILE_ASYNC_ERROR_SIZE尺寸
XFILE_ASYNC_ERROR_RESIZE失败
XFILE_ASYNC_ERROR_CLOSE失败
XFILE_ASYNC_ERROR_COPY失败
XFILE_ASYNC_ERROR_MOVE失败
XFILE_ASYNC_ERROR_DELETEDelete失败
XFILE_ASYNC_ERROR_CREATE创建
XFILE_ASYNC_ERROR_TREE失败
XFILE_ASYNC_ERROR_QUERY重叠查询非法
typedef enum xfileasyncerror { XFILE_ASYNC_ERROR_OPEN = 1, XFILE_ASYNC_ERROR_SUBMIT, XFILE_ASYNC_ERROR_READ, XFILE_ASYNC_ERROR_WRITE, XFILE_ASYNC_ERROR_FLUSH, XFILE_ASYNC_ERROR_SIZE, XFILE_ASYNC_ERROR_RESIZE, XFILE_ASYNC_ERROR_CLOSE, XFILE_ASYNC_ERROR_COPY, XFILE_ASYNC_ERROR_MOVE, XFILE_ASYNC_ERROR_DELETE, XFILE_ASYNC_ERROR_CREATE, XFILE_ASYNC_ERROR_TREE, XFILE_ASYNC_ERROR_QUERY } xfileasyncerror;

xasyncfile类型

异步文件对象绑定一个有界任务池,并在关闭前保留全部已受理操作。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xasyncfile xasyncfile;

xfileasyncreleaseproc类型

零复制写入受理后,在数据不再被任务使用时执行一次释放过程。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfileasyncreleaseproc)( ptr pContext, cbytes pData, size_t iSize)
文件对象

xrtAsyncFileOpen函数

同步完成参数校验和原生文件打开;拒绝与绝对偏移写入冲突的 XFILE_APPEND 标志。

xasyncfile* xrtAsyncFileOpen(xtaskpool* pPool, cstr sPath, const xfileoptions* pOptions)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空、UTF-8文件路径
pOptions输入允许空打开选项;不得含 XFILE_APPEND
返回值
返回含义失败时状态
非空异步文件对象—
NULL打开失败错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_OPEN — 打开失败,cause 保留底层错误
  • XERR_ARGUMENT — 含 XFILE_APPEND 标志或参数非法

范例已编译验证

file/async · 打开与读写 · 观察

	pFile = xrtAsyncFileOpen(
		pPool,
		"xrt-async-example.txt",
		&Options
	);

xrtAsyncFileAdopt函数

采用已经打开的文件,并把唯一关闭责任转交给异步文件对象;失败时调用方仍然拥有 File。

xasyncfile* xrtAsyncFileAdopt(xtaskpool* pPool, xfile File)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
File输入非空已打开的 xfile;成功后只能经 xrtAsyncFileClose 关闭
返回值
返回含义失败时状态
非空异步文件对象(已接管 File)—
NULL采用失败所有权仍归调用方
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/async_tour · Adopt · 观察

	if ( (File == NULL) ||
		((pFile = xrtAsyncFileAdopt(pPool, File)) == NULL) ) {

xrtAsyncFileFlags函数

返回异步文件采用时保存的打开标志;失败返回 0。

uint32 xrtAsyncFileFlags(const xasyncfile* pFile)

参数

参数方向约束说明
pFile输入非空异步文件对象
返回值
返回含义失败时状态
XFILE_* 组合采用时冻结的标志—
0参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file/async_tour · Adopt · 观察

	iFlags = xrtAsyncFileFlags(pFile);

xrtAsyncFileClose函数

停止接收新操作并释放对象所有权;Future 在全部已受理操作结束且原生文件关闭后完成。关闭走任务池资源回收通道,不占普通队列槽位。

xfuture* xrtAsyncFileClose(xasyncfile* pFile)

参数

参数方向约束说明
pFile输入非空成功后调用方立即失去所有权
返回值
返回含义失败时状态
非空关闭 Future(成功无值)—
NULL参数非法XERR_ARGUMENT
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_CLOSE — 原生关闭失败(cause 保留底层错误)

范例已编译验证

file/async_tour · Close · 观察

		xfuture* pClosing = xrtAsyncFileClose(pFile);

		if ( pClosing == NULL ) goto Cleanup;
		pFile = NULL;  /* Close 已受理并释放对象所有权。 */
定位读写

xrtAsyncFileReadAt函数

从绝对偏移读取最多 iSize 字节;成功值为 Future 拥有的 xfiledata(End 标记短读 EOF,Data 额外补零)。同一对象不同偏移可并行,不共享游标。

xfuture* xrtAsyncFileReadAt(xasyncfile* pFile, uint64 iOffset, size_t iSize)

参数

参数方向约束说明
pFile输入非空异步文件对象
iOffset输入—绝对偏移
iSize输入—最多读取字节数
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_READ — 读取失败

范例已编译验证

file/async · 打开与读写 · 观察

	pRead = xrtAsyncFileReadAt(pFile, 0, 64);
	pData = (xfiledata*)waitValue(pRead);

xrtAsyncFileWriteAt函数

从绝对偏移完整写入;提交前复制数据,返回后调用方可以立即释放或修改源缓冲。成功值为 xfilechange。

xfuture* xrtAsyncFileWriteAt(xasyncfile* pFile, uint64 iOffset, xbytesview Data)

参数

参数方向约束说明
pFile输入非空异步文件对象
iOffset输入—绝对偏移
Data输入借用、提交时复制写入数据
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_WRITE — 写入失败

范例已编译验证

file/async · 打开与读写 · 观察

	pWrite = xrtAsyncFileWriteAt(
		pFile,
		0,
		XRT_BYTES_LITERAL("hello async file")
	);

xrtAsyncFileWriteAtRef函数

零复制受理外部数据;提交成功后释放责任转移(释放回调在成功/失败/取消终态后恰好一次),提交失败仍归调用方。零长度不转移所有权。

xfuture* xrtAsyncFileWriteAtRef(xasyncfile* pFile, uint64 iOffset, xbytesview Data, xfileasyncreleaseproc pRelease, ptr pContext)

参数

参数方向约束说明
pFile输入非空异步文件对象
iOffset输入—绝对偏移
Data输入借用至终态非空数据必须提供释放过程
pRelease输入非空数据时非空释放回调
pContext输入任意值原样传给回调
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_tour · WriteAtRef · 观察

	if ( !exampleWaitValue(&pFuture, xrtAsyncFileWriteAtRef(pFile, 8u,
			(xbytesview) { (cbytes)"REF-EXTRA", 9u },
			exampleRelease, NULL), &pValue) ||

xrtAsyncFileWriteAtTake函数

零复制接管由 xrtMalloc 家族分配的非空数据;终态后经 xrtFree 释放。提交失败时所有权仍归调用方;NULL,0 表示空写入。

xfuture* xrtAsyncFileWriteAtTake(xasyncfile* pFile, uint64 iOffset, bytes pData, size_t iSize)

参数

参数方向约束说明
pFile输入非空异步文件对象
iOffset输入—绝对偏移
pData输入xrtMalloc 产物;受理即转移被接管缓冲
iSize输入—字节数
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_tour · WriteAtTake · 观察

		xfuture* pSubmitted = xrtAsyncFileWriteAtTake(pFile, 17u, pTake, 5u);

xrtAsyncFileFlush函数

把已受理写入提交到稳定存储;只读文件直接成功。

xfuture* xrtAsyncFileFlush(xasyncfile* pFile)

参数

参数方向约束说明
pFile输入非空异步文件对象
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_FLUSH — 刷新失败

范例已编译验证

file/async_tour · Ref+Flush · 观察

		!exampleWaitValue(&pFuture, xrtAsyncFileFlush(pFile), NULL) ) {
大小与刷新

xrtAsyncFileSize函数

查询当前文件大小;成功值为 Future 拥有的 xfilesize。

xfuture* xrtAsyncFileSize(xasyncfile* pFile)

参数

参数方向约束说明
pFile输入非空异步文件对象
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_SIZE — 查询失败

范例已编译验证

file/async_tour · Size/Resize · 观察

	if ( !exampleWaitValue(&pFuture, xrtAsyncFileSize(pFile), &pValue) ||

xrtAsyncFileResize函数

修改文件大小;成功值为 xfilechange(Size 为新大小)。

xfuture* xrtAsyncFileResize(xasyncfile* pFile, uint64 iSize)

参数

参数方向约束说明
pFile输入非空异步文件对象
iSize输入—新大小
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_RESIZE — 调整失败

范例已编译验证

file/async_tour · Size/Resize · 观察

		!exampleWaitValue(&pFuture, xrtAsyncFileResize(pFile, 16u),
			&pValue) ) {
整文件

xrtFileReadAllAsync函数

在任务池线程中读取整个文件;成功值为 Future 拥有的 xfiledata(含额外零字节)。

xfuture* xrtFileReadAllAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空(提交时快照)文件路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_whole · 整读 · 观察

	pRead = xrtFileReadAllAsync(pPool, sPath);

xrtFileReadAllLimitAsync函数

在硬上限内读取整个文件;文件超限时 Future 失败。

xfuture* xrtFileReadAllLimitAsync(xtaskpool* pPool, cstr sPath, size_t iLimit)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空文件路径
iLimit输入—源文件字节硬上限
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • XERR_RANGE — 文件越过上限(Future 失败)

范例已编译验证

file/async_tour · 限读 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileReadAllLimitAsync(pPool,
			"xrt-async-whole.tmp", 64u), &pValue) ||

xrtFileWriteAllAsync函数

复制输入并在任务池线程中完整覆盖文件;成功值为 xfilechange。

xfuture* xrtFileWriteAllAsync(xtaskpool* pPool, cstr sPath, xbytesview Data)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目标路径
Data输入借用、提交时复制完整内容
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_tour · 整写 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileWriteAllAsync(pPool,
			"xrt-async-whole.tmp",
			(xbytesview) { (cbytes)"whole-file", 10u }),
			NULL) ) {

xrtFileAppendAsync函数

复制输入并使用操作系统追加语义完整写入。

xfuture* xrtFileAppendAsync(xtaskpool* pPool, cstr sPath, xbytesview Data)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目标路径
Data输入借用、提交时复制追加内容
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_tour · 追加 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileAppendAsync(pPool,
			"xrt-async-tour.tmp",
			(xbytesview) { (cbytes)"tail", 4u }), NULL) ) {

xrtFileWriteAtomicAsync函数

复制输入并通过同目录临时文件原子发布;成功值为 xfilechange。

xfuture* xrtFileWriteAtomicAsync(xtaskpool* pPool, cstr sPath, xbytesview Data)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目标路径
Data输入借用、提交时复制完整内容
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause

范例已编译验证

file/async_whole · 原子写 · 观察

	pWrite = xrtFileWriteAtomicAsync(
		pPool,
		sPath,
		XRT_BYTES_LITERAL("hello async whole file")
	);
文件管理

xrtFileCopyAsync函数

在任务池线程中复制文件;与同步底座共享替换语义,成功 Future 没有值。

xfuture* xrtFileCopyAsync(xtaskpool* pPool, cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sSource输入非空(快照)源文件
sTarget输入非空目标路径
bReplace输入—替换已存在的普通文件
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_COPY — cause 保留 xrt.file 错误

范例已编译验证

file/async_manage · 复制删除 · 观察

	pCopy = xrtFileCopyAsync(pPool, sSource, sTarget, true);

xrtFileMoveAsync函数

在任务池线程中移动文件;成功 Future 没有值。

xfuture* xrtFileMoveAsync(xtaskpool* pPool, cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sSource输入非空源文件
sTarget输入非空目标路径
bReplace输入—替换语义
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_MOVE

范例已编译验证

file/async_tour · 改名 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileMoveAsync(pPool,
			"xrt-async-whole.tmp",
			"xrt-async-moved.tmp", true), NULL) ) {

xrtFileDeleteAsync函数

在任务池线程中删除文件;成功 Future 没有值。

xfuture* xrtFileDeleteAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目标文件
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_DELETE

范例已编译验证

file/async_manage · 复制删除 · 观察

	pDelete = xrtFileDeleteAsync(pPool, sTarget);
目录

xrtDirCreateAsync函数

在任务池线程中使用平台默认模式创建一个目录。

xfuture* xrtDirCreateAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空(快照)目录路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_CREATE

范例已编译验证

file/dir_async · 建删 · 观察

	pCreate = xrtDirCreateAsync(pPool, sPath);

xrtDirCreateModeAsync函数

在任务池线程中使用显式 POSIX 模式创建一个目录;Windows 接受但忽略模式。

xfuture* xrtDirCreateModeAsync(xtaskpool* pPool, cstr sPath, uint32 iMode)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
iMode输入低 12 位POSIX 权限
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_CREATE

范例已编译验证

file/async_tour · 目录族 · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirCreateModeAsync(pPool,
			"xrt-async-dir", 0755), NULL) ||

xrtDirCreateAllAsync函数

在任务池线程中使用平台默认模式创建全部缺失目录。

xfuture* xrtDirCreateAllAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空多级路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_CREATE

范例已编译验证

file/async_tour · 目录族 · 观察

		!exampleWaitValue(&pFuture, xrtDirCreateAllAsync(pPool,
			"xrt-async-deep/a/b"), NULL) ||

xrtDirCreateAllModeAsync函数

在任务池线程中使用显式 POSIX 模式创建全部缺失目录。

xfuture* xrtDirCreateAllModeAsync(xtaskpool* pPool, cstr sPath, uint32 iMode)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空多级路径
iMode输入低 12 位POSIX 权限
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_CREATE

范例已编译验证

file/async_tour · 目录族 · 观察

		!exampleWaitValue(&pFuture, xrtDirCreateAllModeAsync(pPool,
			"xrt-async-deep2/x/y", 0755), NULL) ||

xrtDirRemoveAsync函数

在任务池线程中删除一个空目录。

xfuture* xrtDirRemoveAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空空目录路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_CREATE

范例已编译验证

file/dir_async · 建删 · 观察

	pRemove = xrtDirRemoveAsync(pPool, sPath);

xrtDirEmptyAsync函数

查询目录是否为空;成功值为 Future 拥有的 xdirquery(Empty 字段判定)。

xfuture* xrtDirEmptyAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_QUERY

范例已编译验证

file/async_tour · 目录族 · 观察

		!exampleWaitValue(&pFuture, xrtDirEmptyAsync(pPool,
			"xrt-async-deep/a/b"), NULL) ) {
目录树

xrtFileTreeCopyAsync函数

使用高级选项异步复制目录树;成功值为源树的 xwalkstats。选项在提交时快照。

xfuture* xrtFileTreeCopyAsync(xtaskpool* pPool, cstr sSource, cstr sTarget, const xtreecopyoptions* pOptions)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sSource输入非空(快照)源树根
sTarget输入非空目标路径
pOptions输入允许空空 = 默认保守选项
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE

范例已编译验证

file/async_tour · 目录树 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileTreeCopyAsync(pPool,
			"xrt-async-deep2", "xrt-async-tree-copy", NULL),
		NULL) ) {

xrtDirCopyAsync函数

常用目录复制;bReplace 为真时合并目录并替换冲突对象。成功值为源树统计。

xfuture* xrtDirCopyAsync(xtaskpool* pPool, cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sSource输入非空源树
sTarget输入非空目标路径
bReplace输入—合并/替换语义
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE

范例已编译验证

file/tree_async · 复制删除 · 观察

	pCopy = xrtDirCopyAsync(pPool, sSource, sTarget, false);

xrtFileTreeRemoveAsync函数

后序异步删除目录树;成功值为处理结果 xwalkstats。

xfuture* xrtFileTreeRemoveAsync(xtaskpool* pPool, cstr sPath, bool bKeepRoot)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空树根路径
bKeepRoot输入—保留根目录
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE

范例已编译验证

file/async_tour · 目录树 · 观察

	if ( !exampleWaitValue(&pFuture, xrtFileTreeRemoveAsync(pPool,
			"xrt-async-tree-copy", true), NULL) ||

xrtDirRemoveAllAsync函数

递归删除目录及全部内容;成功值为处理统计。

xfuture* xrtDirRemoveAllAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空树根路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE

范例已编译验证

file/tree_async · 复制删除 · 观察

	pRemove = xrtDirRemoveAllAsync(pPool, sTarget);

xrtDirCleanAsync函数

删除目录全部内容并保留根;成功值为处理统计。

xfuture* xrtDirCleanAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE

范例已编译验证

file/async_tour · Clean · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirCleanAsync(pPool,
			"xrt-async-deep-moved"), NULL) ) {

xrtDirMoveAsync函数

异步移动目录树;优先同卷改名,跨卷时复制成功后删除源树。成功 Future 没有值。

xfuture* xrtDirMoveAsync(xtaskpool* pPool, cstr sSource, cstr sTarget, bool bReplace)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sSource输入非空源树
sTarget输入非空目标路径
bReplace输入—替换语义
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_MOVE

范例已编译验证

file/async_tour · Move · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirMoveAsync(pPool,
			"xrt-async-deep", "xrt-async-deep-moved", true),
		NULL) ) {

xrtDirStatsAsync函数

异步统计目录树;成功值为 xwalkstats。

xfuture* xrtDirStatsAsync(xtaskpool* pPool, cstr sPath, bool bRecursive)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
bRecursive输入—深入子目录
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_QUERY

范例已编译验证

file/async_tour · 统计 · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirStatsAsync(pPool,
			"xrt-async-dir", true), &pValue) ||

xrtDirSizeAsync函数

异步计算普通文件总字节数;成功值为 xfilesize。

xfuture* xrtDirSizeAsync(xtaskpool* pPool, cstr sPath, bool bRecursive)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
bRecursive输入—深入子目录
返回值
返回含义失败时状态
非空已受理的 Future;结果/错误/取消经 Future 表达—
NULL受理前失败(参数/队列满/池关闭)线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_SUBMIT — 队列达到硬上限(cause 保留任务池 XERR_AGAIN)
  • 受理后失败保存在 Future 中,经 xrtFutureError 读取;底层错误在 xrtErrorCause
  • xrt.file.async / XFILE_ASYNC_ERROR_QUERY

范例已编译验证

file/async_tour · 统计 · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirSizeAsync(pPool,
			"xrt-async-dir", true), &pValue) ||

xrtDirEnsureEmptyAsync函数

异步创建缺失目录,或清空已有目录并保留根;成功 Future 没有值。

xfuture* xrtDirEnsureEmptyAsync(xtaskpool* pPool, cstr sPath)

参数

参数方向约束说明
pPool输入非空、须存活到全部 Future 完成调用方拥有的有界任务池
sPath输入非空目录路径
返回值
返回含义失败时状态
非空已受理的 Future—
NULL受理前失败线程错误经 xrtGetError() 报告
错误
  • xrt.file.async / XFILE_ASYNC_ERROR_TREE — cause 保留 xrt.tree 错误

范例已编译验证

file/async_tour · EnsureEmpty · 观察

	if ( !exampleWaitValue(&pFuture, xrtDirEnsureEmptyAsync(pPool,
			"xrt-async-dir"), NULL) ||

常量索引常量

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

常量说明
XFILE_ASYNC_ERROR_CLOSE见头文件注释
XFILE_ASYNC_ERROR_COPY见头文件注释
XFILE_ASYNC_ERROR_CREATE见头文件注释
XFILE_ASYNC_ERROR_DELETE见头文件注释
XFILE_ASYNC_ERROR_FLUSH见头文件注释
XFILE_ASYNC_ERROR_MOVE见头文件注释
XFILE_ASYNC_ERROR_OPEN见头文件注释
XFILE_ASYNC_ERROR_QUERY见头文件注释
XFILE_ASYNC_ERROR_READ见头文件注释
XFILE_ASYNC_ERROR_RESIZE见头文件注释
XFILE_ASYNC_ERROR_SIZE见头文件注释
XFILE_ASYNC_ERROR_SUBMIT见头文件注释
XFILE_ASYNC_ERROR_TREE见头文件注释
XFILE_ASYNC_ERROR_WRITE见头文件注释