You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

632 lines
28 KiB

/*
* @Author: BATU1579
* @CreateDate: 2022-07-23 09:05:08
* @LastEditor: BATU1579
* @LastTime: 2022-09-11 10:56:20
* @FilePath: \\src\\types\\files.d.ts
* @Description: 文件操作模块
*/
declare module 'files' {
import { encode } from 'base64';
global {
/**
* @description: `files` 模块提供了一些常见的文件处理,包括文件读写、移动、复制、删掉等。一次性的文件读写可以直接使用 `files.read()` , `files.write()` , `files.append()` 等方便的函数,但如果需要频繁读写或随机读写,则因该使用 `open()` 函数打开一个文件对象来操作文件,并在操作完毕后调用 `close()` 函数关闭文件。
*/
const files: Files;
// 声明全局函数
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {ReadableTextFile} 打开的文件对象。
*/
function open(path: string, mode?: 'r', encoding?: encode, bufferSize?: number): ReadableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {ReadableTextFile} 打开的文件对象。
*/
function open(path: string, mode?: 'r', encoding?: string, bufferSize?: number): ReadableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {WritableTextFile} 打开的文件对象。
*/
function open(path: string, mode?: 'w' | 'a' | 'rw', encoding?: encode, bufferSize?: number): PWritableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {WritableTextFile} 打开的文件对象。
*/
function open(path: string, mode?: 'w' | 'a' | 'rw', encoding?: string, bufferSize?: number): PWritableTextFile;
}
interface Files {
/**
* @description: 检查路径 `path` 是否是文件。
* @param {string} path 文件路径。
* @return {boolean} 是文件则返回 `true` ,否则返回 `false`。
* @example
* ```typescript
* log(files.isDir('/sdcard/文件.txt')); // true
* ```
*/
isFile(path: string): boolean;
/**
* @description: 检查路径 `path` 是否是文件夹。
* @param {string} path 文件夹路径。
* @return {boolean} 是文件夹则返回 `true` ,否则返回 `false`。
* @example
* ```typescript
* log(files.isDir('/sdcard/文件夹')); // true
* ```
*/
isDir(path: string): boolean;
/**
* @description: 检查文件夹 `path` 是否为空文件夹。
* @param {string} path 文件夹路径。
* @return {boolean} 为空文件夹则返回 `true` ,否则返回 `false` 。如果该路径并非文件夹,则直接返回 `false` 。
*/
isEmptyDir(path: string): boolean;
/**
* @description: 连接两个路径并返回。
* @param {string} parent 父目录路径。
* @param {string} child 子目录路径。
* @return {string} 连接后的路径。
* @example
* ```typescript
* log(files.join('/sdcard/', '1.txt')) // /sdcard/1.txt
* ```
*/
join(parent: string, child: string): string;
/**
* @description: 创建一个文件或文件夹。
* @param {string} path 文件或文件夹路径。
* @return {boolean} 创建成功则返回 `true` ,否则返回 `false` 。如果文件或文件夹已经存在,则直接返回 `false` 。
* @example
* ```typescript
* files.create('/sdcard/新文件夹/');
* ```
*/
create(path: string): boolean;
/**
* @description: 创建一个文件或文件夹并返回是否创建成功。如果文件所在文件夹不存在,则先创建他所在的一系列文件夹。
* @param {string} path 文件或文件夹路径。
* @return {boolean} 创建成功则返回 `true` ,否则返回 `false` 。如果文件或文件夹已经存在,则直接返回 `false` 。
*/
createWithDirs(path: string): boolean;
/**
* @description: 检查路径 `path` 处的文件是否存在。
* @param {string} path 文件路径。
* @return {boolean} 文件存在则返回 `true` ,否则返回 `false` 。
*/
exists(path: string): boolean;
/**
* @description: 确保路径 `path` 所在的文件夹存在。如果该路径所在文件夹不存在,则创建该文件夹。例如对于路径'/sdcard/Download/ABC/1.txt',如果/Download/文件夹不存在,则会先创建 Download,再创建 ABC 文件夹。
* @param {string} path 文件夹路径。
*/
ensureDir(path: string): void;
/**
* @description: 读取文本文件 `path` 的所有内容并返回。如果文件不存在,则抛出 `FileNotFoundException` 。
* @param {string} path 文件路径。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @return {string} 读取的文件内容。
* @example
* ```typescript
* log(files.read('/sdcard/1.txt'));
* ```
*/
read(path: string, encoding?: encode): string;
/**
* @description: 读取文本文件 `path` 的所有内容并返回。如果文件不存在,则抛出 `FileNotFoundException` 。
* @param {string} path 文件路径。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @return {string} 读取的文件内容。
* @example
* ```typescript
* log(files.read('/sdcard/1.txt'));
* ```
*/
read(path: string, encoding?: string): string;
/**
* @description: 读取文件 path 的所有内容并返回一个字节数组。如果文件不存在,则抛出 `FileNotFoundException` 。
*
* **注意!:**
*
* - 该数组是 Java 的数组,不具有 JavaScript 数组的 `forEach()` , `slice()` 等函数。
*
* @param {string} path 文件路径。
* @return {JavaByteArray} 16 进制数组。
* @example
* ```typescript
* let data = files.readBytes('/sdcard/1.png');
* let sb = new java.lang.StringBuilder();
* for (let i = 0; i < data.length; i++) {
* sb.append(data[i].toString(16));
* }
* log(sb.toString());
* ```
*/
readBytes(path: string): JavaByteArray;
/**
* @description: 把 text 写入到文件 path 中。如果文件存在则覆盖,不存在则创建。
* @param {string} path 文件路径。
* @param {string} text 要写入的文本内容。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @example
* ```typescript
* // 写入文件
* files.write('/sdcard/1.txt', 'some text');
* // 用其他应用查看文件
* app.viewFile('/sdcard/1.txt');
* ```
*/
write(path: string, text: string, encoding?: encode): void;
/**
* @description: 把 `text` 写入到文件 `path` 中。如果文件存在则覆盖,不存在则创建。
* @param {string} path 文件路径。
* @param {string} text 要写入的文本内容。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @example
* ```typescript
* // 写入文件
* files.write('/sdcard/1.txt', 'some text');
* // 用其他应用查看文件
* app.viewFile('/sdcard/1.txt');
* ```
*/
write(path: string, text: string, encoding?: string): void;
/**
* @description: 把 `bytes` 写入到文件 `path` 中。如果文件存在则覆盖,不存在则创建。
* @param {string} path 文件路径。
* @param {ByteArray} bytes 字节数组,要写入的二进制数据。
*/
writeBytes(path: string, bytes: ByteArray): void;
/**
* @description: 把 `text` 追加到文件 `path` 的末尾。如果文件不存在则创建。
* @param {string} path 文件路径。
* @param {string} text 要写入的文本内容。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @example
* ```typescript
* // 在文件后追加文本
* files.append('/sdcard/1.txt', 'some text');
* // 用其他应用查看文件
* app.viewFile('/sdcard/1.txt');
* ```
*/
append(path: string, text: string, encoding?: encode): void;
/**
* @description: 把 `text` 追加到文件 `path` 的末尾。如果文件不存在则创建。
* @param {string} path 文件路径。
* @param {string} text 要写入的文本内容。
* @param {string} [encoding] 字符编码(默认为 `utf-8` )。
* @example
* ```typescript
* // 在文件后追加文本
* files.append('/sdcard/1.txt', 'some text');
* // 用其他应用查看文件
* app.viewFile('/sdcard/1.txt');
* ```
*/
append(path: string, text: string, encoding?: string): void;
/**
* @description: 把 `bytes` 追加到文件 `path` 的末尾。如果文件不存在则创建。
* @param {string} path 文件路径。
* @param {ByteArray} bytes 字节数组,要写入的二进制数据。
*/
appendBytes(path: string, bytes: ByteArray): void;
/**
* @description: 复制文件。
* @param {string} fromPath 要复制的 **原文件** 路径。
* @param {string} toPath 复制到的 **新文件** 路径。
* @return {boolean} 是否复制成功。
* @example
* ```typescript
* // 把 1.txt 文件从 sd 卡根目录复制到 Download 文件夹
* files.copy('/sdcard/1.txt', '/sdcard/Download/1.txt');
* ```
*/
copy(fromPath: string, toPath: string): boolean;
/**
* @description: 移动文件。
* @param {string} fromPath 要移动的 **原文件** 路径。
* @param {string} toPath 移动到的 **新文件** 路径。
* @return {boolean} 是否移动成功。
* @example
* ```typescript
* // 把 1.txt 文件从 sd 卡根目录移动到 Download 文件夹
* files.move('/sdcard/1.txt', '/sdcard/Download/1.txt');
* ```
*/
move(fromPath: string, toPath: string): boolean;
/**
* @description: 重命名文件。
* @param {string} path 要重命名的 **原文件** 路径。
* @param {string} newName 要重命名的 **新文件名**。
* @return {boolean} 是否重命名成功。
* @example
* ```typescript
* // 将 sd 卡根目录下的 1.txt 文件重命名为 2.txt
* files.rename('/sdcard/1.txt', '2.txt');
* ```
*/
rename(path: string, newName: string): boolean;
/**
* @description: 重命名文件,不包含拓展名。
* @param {string} path 要重命名的 **原文件** 路径。
* @param {string} newName 要重命名的 **新文件名** (不带扩展名)。
* @return {boolean} 是否重命名成功。
* @example
* ```typescript
* // 将 sd 卡根目录下的 1.txt 文件重命名为 2.txt
* files.renameWithoutExtension('/sdcard/1.txt', '2');
* ```
*/
renameWithoutExtension(path: string, newName: string): boolean;
/**
* @description: 获取路径中的文件名。
* @param {string} path 文件路径。
* @return {string} 文件名。
* @example
* ```typescript
* // 返回 '1.txt'
* files.getName('/sdcard/1.txt');
* ```
*/
getName(path: string): string;
/**
* @description: 获取路径中的文件名(不含拓展名)。
* @param {string} path 文件路径。
* @return {string} 文件名。
* @example
* ```typescript
* // 返回 '1'
* files.getNameWithoutExtension('/sdcard/1.txt');
* ```
*/
getNameWithoutExtension(path: string): string;
/**
* @description: 获取路径中文件的拓展名。
* @param {string} path 文件路径。
* @return {string} 文件扩展名。
* @example
* ```typescript
* // 返回 'txt'
* files.getExtension('/sdcard/1.txt');
* ```
*/
getExtension(path: string): string;
/**
* @description: 删除单个文件或 **空文件夹**。
*
* **注意!:**
*
* - 此方法只能删除空文件夹,如果要删除非空文件夹需要使用 `removeDir` 方法。
*
* @param {string} path 文件或文件夹路径。
* @return {boolean} 是否删除成功。
*/
remove(path: string): boolean;
/**
* @description: 删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹。
* @param {string} path 文件夹路径。
* @return {boolean} 是否全部删除成功。
*/
removeDir(path: string): boolean;
/**
* @description: 获取 SD 卡路径。所谓 SD 卡,即外部存储器。
* @return {string} SD 卡路径。
*/
getSdcardPath(): string;
/**
* @description: 获取脚本的 '当前工作文件夹路径'。
* @return {string | null} 如果脚本本身为脚本文件,则返回这个脚本文件所在目录;否则返回null获取其他设定路径。
* @example
* ```typescript
* // 脚本文件路径:'/sdcard/脚本/1.js'
* // 返回 '/sdcard/脚本/'
* files.cwd()
* ```
*/
cwd(): string | null;
/**
* @description: 将相对路径转换为绝对路径。
* @param {string} relativePath 相对路径。
* @return {string} 转换后的绝对路径。
* @example
* ```typescript
* // 脚本文件路径:'/sdcard/脚本/1.js'
* // 返回 '/sdcard/脚本/1.png'
* files.path('./1.png')
* ```
*/
path(relativePath: string): string;
/**
* @description: 列出文件夹 `path` 下的满足条件的文件和文件夹的名称的数组。如果不加 `filter` 参数,则返回所有文件和文件夹。
* @param {string} path 路径。
* @param {function} [filter] 用于过滤的回调函数。参数为string(文件名),返回值为 boolean (是否符合过滤条件)。
* @return {array} 满足条件的文件和文件夹的名称。
* @example
* ```typescript
* // 列出 sdcard 目录下所有文件和文件夹
* log(files.listDir('/sdcard/'));
* ```
* @example
* ```typescript
* // 列出脚本目录下所有 js 脚本文件
* let dir = '/sdcard/脚本'
* let jsFiles = files.listDir(dir, (i) => {
* return i.endsWith('.js') && files.isFile(files.join(dir, i));
* });
* log(jsFiles);
* ```
*/
listDir(path: string, filter?: (i: string) => boolean): string[];
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {ReadableTextFile} 打开的文件对象。
*/
open(path: string, mode?: 'r', encoding?: encode, bufferSize?: number): ReadableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {ReadableTextFile} 打开的文件对象。
*/
open(path: string, mode?: 'r', encoding?: string, bufferSize?: number): ReadableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {WritableTextFile} 打开的文件对象。
*/
open(path: string, mode?: 'w' | 'a' | 'rw', encoding?: encode, bufferSize?: number): PWritableTextFile;
/**
* @description: 打开一个文件。根据打开模式返回不同的文件对象。
*
* **注意!:**
*
* - 对于 `w` 模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容。其他模式文件不存在会抛出 `FileNotFoundException` 。
*
* @param {string} path 文件路径。
* @param {string} [mode] 文件打开模式(默认为 `r` ),可选的值为:
*
* - `r` - 只读文本模式。该模式下只能对文件执行 **文本** 读取操作。
* - `w` - 只写文本模式。该模式下只能对文件执行 **文本** 覆盖写入操作。
* - `a` - 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
* - `rw` - 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。目前暂不支持二进制模式,随机读写模式。
*
* @param {encode} [encoding] 字符编码(默认为 `utf-8` )。
* @param {number} [bufferSize] 文件读写的缓冲区大小。
* @return {WritableTextFile} 打开的文件对象。
*/
open(path: string, mode?: 'w' | 'a' | 'rw', encoding?: string, bufferSize?: number): PWritableTextFile;
}
/**
* @description: 只读文件对象。
*/
class ReadableTextFile {
/**
* @description: 读取该文件剩余的所有内容。
* @return {string} 该文件剩余的所有内容的字符串。
*/
read(): string;
/**
* @description: 读取该文件接下来最长为 `maxCount` 的字符串。
*
* **注意!:**
*
* - 即使文件剩余内容不足 `maxCount` 也不会出错。
*
* @param {number} maxCount 最大读取的字符数量。
* @return {string} 接下来最长为 `maxCount` 的字符串。
*/
read(maxCount: number): string;
/**
* @description: 读取该文件的下一行的文本(不包含换行符)。
* @return {string} 下一行的文本。
*/
readline(): string;
/**
* @description: 读取该文件剩余的所有行。
* @return {array} 文件剩余所有行按顺序组成的字符串数组。
*/
readlines(): string[];
/**
* @description: 关闭该文件。
*
* **注意!:**
*
* - 打开一个文件不再使用时务必关闭
*
*/
close(): void;
}
/**
* @description: 只写文件对象。
*/
class PWritableTextFile {
/**
* @description: 把文本内容 `text` 写入到文件中。
* @param {string} text 要写入的文本。
*/
write(text: string): void;
/**
* @description: 把文本 `line` 写入到文件中,并写入一个换行符。
* @param {string} line 要写入的整行文本。
*/
writeline(line: string): void;
/**
* @description: 把多行文本写入到文件中,并在每行结束写入一个换行符。
* @param {array} lines 多行文本的字符串数组。
*/
writelines(lines: string[]): void;
/**
* @description: 把缓冲区内容输出到文件中。
*/
flush(): void;
/**
* @description: 关闭文件。同时会被缓冲区内容输出到文件。
*
* **注意!:**
*
* - 打开一个文件写入后,不再使用时务必关闭,否则文件可能会丢失
*
*/
close(): void;
}
type ByteArray = Uint8Array | number[];
type JavaByteArray = {
[K in keyof Uint8Array as K extends JSArrayFunction ? never : K]: Uint8Array[K]
};
// TODO: 验证每个方法是否都不可用
type JSArrayFunction = 'push' | 'pop' | 'unshift' | 'shift' | 'valueOf' | 'indexOf' | 'splice' | 'slice' | 'sort' | 'concat' | 'reverse' | 'join' | 'forEach' | 'filter' | 'map' | 'reduce' | 'find' | 'every' | 'some' | 'lastIndexOf' | 'reduceRight' | 'findIndex' | 'fill' | 'keys' | 'values' | 'copyWithin'
}