模块 @sys
模块 @sys
此模块包含基于 NodeJS 原语建模的运行时方法。
要获取对 sys 模块的引用,请使用:
import * as sys from "@sys"; // '@' is mandatory
sys 模块中的所有方法都遵循 NodeJS 调用约定,唯一的例外是 - 不使用回调 - 函数返回 promise,因此在异步函数中使用它们,例如:
const p = new sys.Pipe();
async function connect() {
await p.connect('fooapp');
console.log(`Connected to ${p.getpeername()}`);
...
}
sys 建立在 Sciter.JS 内部使用的 libuv 和 txiki 项目的 QuickJS/libuv 包装器之上。
sys.fs
namespace - 文件系统。
功能
fs.open(path:string, flags:string [, mode:integer]): Promise(File)
在路径处打开文件。
flags : 字符串
mode 设置文件模式(权限和粘滞位)(如果创建了文件)。默认值:0o666(可读和可写)
回报:将通过 fs 兑现的承诺。File 对象。
有关更多详细信息,请参阅 POSIX open() 文档。
某些字符 (
< > : " / \ | ? *
) 在 Windows 下保留,如命名文件、路径和命名空间中所述。在 NTFS 下,如果文件名包含冒号,Node.js将打开文件系统流,如此 MSDN 页所述。“a”:打开文件进行追加。如果文件不存在,则创建该文件。
“ax”:与“a”类似,但如果路径存在,则失败。
'a+':打开文件进行读取和追加。如果文件不存在,则创建该文件。
“ax+”:类似于“a+”,但如果路径存在,则失败。
“as”:打开文件以同步模式追加。如果文件不存在,则创建该文件。
“as+”:打开文件以同步模式读取和追加。如果文件不存在,则创建该文件。
'r':默认值,打开文件进行读取。如果文件不存在,则会发生异常。
“r+”:打开文件进行读取和写入。如果文件不存在,则会发生异常。
“rs+”:打开文件以同步模式进行读写。指示操作系统绕过本地文件系统缓存。
这主要用于在 NFS 挂载上打开文件,因为它允许跳过可能过时的本地缓存。它对 I/O 性能有非常实际的影响,因此除非需要,否则不建议使用此标志。
这不会将 fs.open() 或 fsPromises.open() 变成同步阻塞调用。如果需要同步操作,则应使用类似 fs.$open() 的东西。
'w':打开文件进行写入。文件被创建(如果不存在)或被截断(如果存在)。
'wx':与“w”类似,但如果路径存在,则失败。
'w+':打开文件进行读取和写入。文件被创建(如果不存在)或被截断(如果存在)。
“wx+”:类似于“w+”,但如果路径存在,则失败。
fs.sync.open(path:string, flags:string [, mode:integer]): File
的
fs.open()
同步版本。返回 fs。文件对象,见下文。fs.stat(path:string): Promise(stat)
fs.openSync(path:string, flags:string [, mode:integer]): File
返回解析为具有以下字段的统计信息结构(对象)的 promise:
int64 st_dev; /* ID of device containing file */
int64 st_ino; /* inode number */
int32 st_mode; /* ORed type flags (see below) */
int64 st_nlink; /* number of hard links */
int64 st_uid; /* user ID of owner */
int64 st_gid; /* group ID of owner */
int64 st_rdev; /* device ID (if special file) */
int64 st_size; /* total size, in bytes */
int64 st_blksize; /* blocksize for file system I/O */
int64 st_blocks; /* number of 512B blocks allocated */
float64 st_atime; /* time of last access, seconds since 1970 */
float64 st_mtime; /* time of last modification, seconds since 1970 */
float64 st_ctime; /* time of last status change, seconds since 1970 */
float64 st_birthtime;/* time of creation, seconds since 1970 */
类型标志(st_mode):
如果 file/dir 不存在,则引发 Error
异常。
此外,统计结构可能具有以下之一:
isFile
,true 是一个文件isDirectory
,true 是一个目录isSymbolicLink
,true 是一个链接fs.S_IFDIR
- 这是目录文件的文件类型常量;fs.S_IFCHR
- 这是面向字符的设备文件的文件类型常量;fs.S_IFBLK
- 这是面向块的设备文件的文件类型常量;fs.S_IFREG
- 这是常规文件的文件类型常量;fs.S_IFLNK
- 这是符号链接的文件类型常量;fs.S_IFSOCK
- 这是套接字的文件类型常量;fs.S_IFIFO
- 这是FIFO或管道的文件类型常量;
fs.sync.stat(path:string): stat
fs.statSync(path:string): stat
上述的同步版本;
上述的同步版本。如果 file/dir 不存在,则返回 null。
fs.lstat(path:string): promise(stat)
lstat() 与 stat() 相同,只是如果 path 是符号链接,则链接本身是 stat-ed,而不是它引用的文件。
请参见 lstat
fs.sync.lstat(path:string): stat
fs.lstatSync(path:string): stat
上述的同步版本。
fs.realpath(pathname:string):string
返回规范化的绝对路径名。
realpath()
展开所有符号链接并解析对 /./
的 /../
引用以及 路径名字符串中的其他 '/'
字符,以生成规范化的绝对路径名。
fs.unlink(path:string) : Promise
删除文件。如果 path 引用符号链接,则删除该链接,而不会影响该链接引用的文件或目录。如果路径引用的文件路径不是符号链接,则删除该文件。有关详细信息,请参阅 POSIX 取消链接文档。
async function deleteFile(path) { await sys.fs.unlink(path) }
fs.sync.unlink(path:string)
fs.unlinkSync(path:string)
fs.rename(oldPath:string,newPath:string) : Promise
重命名文件。注意:这可能会将文件移动到其他设备。等同于重命名。
fs.renameSync(oldPath:string,newPath:string)
fs.sync.rename(oldPath:string,newPath:string)
fs.mkdtemp(template:string) : Promise(result:string)
创建唯一的临时目录。模板的最后六个字符必须为“XXXXXX”。相当于 mkdtemp
fs.mkstemp(template:string) : Promise
创建唯一的临时文件。模板的最后六个字符必须为“XXXXXX”
fs.rmdir(path) : Promise
删除文件夹
fs.sync.rmdir(path)
fs.rmdirSync(path)
同步删除文件夹
fs.mkdir(path[, mode = 0o777]) : Promise
创建文件夹。
fs.sync.mkdir(path[, mode = 0o777])
fs.mkdirSync(path[, mode = 0o777])
创建文件夹(同步)
fs.chmod(path, mode:int]) : Promise
异步 chmod。
fs.sync.chmod(path, mode:int])
fs.chmodSync(path, mode:int])
同步 chmod。在发生错误时引发异常。
fs.copyfile(srcpath,dstpath[,flags:int]) : Promise
异步文件复制。
标志(可选)是以下各项的组合:
fs.UV_FS_COPYFILE_EXCL
- 如果目标已存在,则返回错误;fs.UV_FS_COPYFILE_FICLONE
- 若要尝试创建 reflink,如果不支持写入时复制,则使用回退复制机制。fs.UV_FS_COPYFILE_FICLONE_FORCE
- 若要尝试创建 reflink,如果不支持 copy-on-write,则返回错误。
fs.sync.copyfile(srcpath,dstpath[,flags:int])
fs.copyfileSync(srcpath,dstpath[,flags:int])
fs.readdir(path:string) : Promise(Dir)
异步读取路径目录。promise 解析为 Dir 对象 - direntry 结构列表:
{
name: string, // local file name + extension
type: integer, // ORed flags (see below)
}
该列表不包含“.”和“..”条目。
目录类型位标志:
fs.UV_DIRENT_UNKNOWN
fs.UV_DIRENT_FILE
-文件fs.UV_DIRENT_DIR
-目录fs.UV_DIRENT_LINK
-链接fs.UV_DIRENT_FIFO
- FIFO设备fs.UV_DIRENT_SOCKET
-插座fs.UV_DIRENT_CHAR
- 像终端一样的字符流设备fs.UV_DIRENT_BLOCK
- 块设备
for await (const {name,type} of readdir("path")) {
...
}
fs.sync.readdir(path:string): filelist
fs.readdirSync(path:string): filelist
返回目录结构列表的 fs.readdir()
同步版本。如果 path 不是文件夹,则返回 null。
fs.readFile(path:string) : Promise(ArrayBuffer)
fs.readfile(path:string) : Promise(ArrayBuffer)
异步读取整个文件。承诺在成功或失败时解析为 ArrayBuffer:
try {
let data = await fs.readfile("D:/foo/bar.txt");
let text = srt.decode(data,"utf-8");
} catch () {
...
}
fs.sync.readFile() : ArrayBuffer
fs.sync.readfile() : ArrayBuffer
fs.readFileSync() : ArrayBuffer
fs.readfileSync() : ArrayBuffer
fs.readFile(path:string)
上述的同步版本。在发生错误时引发异常。
sys.fs.watch()
监视文件或文件夹的更改。包装 libuv::uv_fs_event_t。
sys.fs.watch(path, callback) : WatchFS
参数
path :字符串,要监视的文件夹或文件的路径;
callback :
function(path: string, events: int)
,在文件夹中文件或文件发生更改时调用的回调函数。events 是两个标志的 OR 组合:0x01 - 重命名事件;
0x02 - 更改事件;
返回
该函数返回一个 WatchFS 对象,该对象具有:
watch.path
、property、string、read-only :sys.fs.watch()
调用 with 的原始路径;watch.close()
、 方法 :调用它停止手表操作; 注意
如果在一个文件夹上使用, sys.fs.watch()
将对这个文件夹的内容和其中的子文件夹进行深度监控。
注意
建议在退出前调用 watch.close()
所有活动监视器。
如果要监视的路径不存在,则 Error
抛出。
fs.splitpath()
该函数拆分目录和文件部分的路径:
sys.fs.splitpath(path:string) : [dirpath:string, file:string]
参数
path :字符串,文件夹或文件的路径;
返回
该函数返回 pair(两个元素的数组):
[0]
,字符串,dir 的路径,不带尾随 '/';[1]
、字符串、文件部分 - 名称和扩展名;
注意
使用 dirname()
和 basename()
在 Posix 上。 _splitpath()
在 Windows 上。
类
fs.File
class - 表示文件。
file.read([lengthToRead:int [, filePosition:int]]): Promise(Uint8Array)
file.readSync([lengthToRead:int [, filePosition:int]]): Uint8Array
file.write(string|***Array|ArrayBuffer[,filePosition:int]) : Promise(result:int)
file.writeSync(string|***Array|ArrayBuffer[,filePosition:int]) : int
file.close() : Promise(undefined)
'file.closeSync() : 未定义
file.fileno() : int
file.stat() : Promise(object)
file.path : string
司 司长。Dir 类 - 目录访问者
dir.close()
dir.path
dir.next()
[async iterator]
网络功能
TCP 套接字类
socket.close()
socket.read():Promise(data)
socket.write(data:TypedArray | ArrayBuffer):Promise
socket.shutdown()
socket.fileno()
socket.listen([backlog:int])
socket.accept():Promise(socket)
socket.getsockname(): {ip:...,port:...,family:...}
socket.getpeername(): {ip:...,port:...,family:...}
socket.connect({ip:...,port:...})
socket.bind({ip:...,port:...})
UDP 套接字类
socket.close()
socket.recv():Promise({data,flags:int,addr:{ip:...,port:...}})
socket.send(data:TypedArray | ArrayBuffer [,{ip,port}])
socket.fileno()
socket.getsockname(): {ip:...,port:...,family:...}
socket.getpeername(): {ip:...,port:...,family:...}
socket.connect({ip:...,port:...}):Promise
socket.bind({ip:...,port:...})
管道 - 主要是IPC
socket.close()
socket.read()
socket.write(data:TypedArray | ArrayBuffer)
socket.fileno()
socket.listen([backlog:int])
socket.accept():Promise(socket)
socket.getsockname():string
socket.getpeername():string
socket.connect(name:string):Promise
socket.bind(name:string)
TTY 基元
tty.close()
tty.read()
tty.write()
tty.fileno()
tty.setMode()
tty.getWinSize()
sys.spawn()
- 使用 stdin/strout/stderr 重定向运行进程。
process.kill()
process.wait()
process.pid
process.stdin
process.stdout
process.stderr
sys.****
其他功能:
sys.hrtime()
sys.gettimeofday()
sys.uname()
sys.isatty()
sys.environ()
sys.getenv()
sys.setenv()
sys.unsetenv()
sys.cwd()
- 获取当前工作目录sys.homedir()
sys.tmpdir()
sys.exepath()
sys.random(