添加 io 与 path 工具模块
This commit is contained in:
169
src/tiny/io.ts
Normal file
169
src/tiny/io.ts
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
export enum AccessType {
|
||||||
|
ACCESS_RESOURCES,
|
||||||
|
ACCESS_USERDATA,
|
||||||
|
ACCESS_FILESYSTEM,
|
||||||
|
ACCESS_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
export enum ModeFlags {
|
||||||
|
READ = 1,
|
||||||
|
WRITE = 2,
|
||||||
|
READ_WRITE = 3,
|
||||||
|
WRITE_READ = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
export class FileAccess {
|
||||||
|
|
||||||
|
protected path: string;
|
||||||
|
|
||||||
|
/** close a file */
|
||||||
|
close(): void {};
|
||||||
|
/** true when file is open */
|
||||||
|
is_open(): boolean { return false; }
|
||||||
|
|
||||||
|
/** returns the path for the current open file */
|
||||||
|
get_path(): string { return ""; }
|
||||||
|
/** returns the absolute path for the current open file */
|
||||||
|
get_path_absolute(): string { return ""; }
|
||||||
|
|
||||||
|
/** seek to a given position */
|
||||||
|
seek(p_position: number) {}
|
||||||
|
/** seek from the end of file */
|
||||||
|
seek_end(p_position: number) {}
|
||||||
|
|
||||||
|
/* get position in the file */
|
||||||
|
get_position(): number { return -1; }
|
||||||
|
/* get size of the file */
|
||||||
|
get_len(): number { return -1; }
|
||||||
|
|
||||||
|
/** reading passed EOF */
|
||||||
|
eof_reached(): boolean { return false; }
|
||||||
|
|
||||||
|
|
||||||
|
get_as_utf8_string(): string { return ""; }
|
||||||
|
save_as_utf8_string(text: string) {}
|
||||||
|
|
||||||
|
get_as_array(): Uint8Array { return null; }
|
||||||
|
save_as_array(buffer: Uint8Array) {}
|
||||||
|
|
||||||
|
store_string(text: string) {}
|
||||||
|
|
||||||
|
static create(path: string): FileAccess {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static open(path: string, mode_flags: ModeFlags): FileAccess {
|
||||||
|
switch (get_runtime()) {
|
||||||
|
case JavaScriptRuntime.NodeJS:
|
||||||
|
return NodeJSFileAccess.open(path, mode_flags);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static exists(path: string): boolean {
|
||||||
|
switch (get_runtime()) {
|
||||||
|
case JavaScriptRuntime.NodeJS:
|
||||||
|
return NodeJSFileAccess.exists(path);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DirAccess {
|
||||||
|
static exists(path: string): boolean {
|
||||||
|
switch (get_runtime()) {
|
||||||
|
case JavaScriptRuntime.NodeJS:
|
||||||
|
return NodeJSFileAccess.exists(path);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static make_dir(p_dir: string, recursive: boolean = false) {
|
||||||
|
switch (get_runtime()) {
|
||||||
|
case JavaScriptRuntime.NodeJS:
|
||||||
|
return NodeJSDirAccess.make_dir(p_dir, recursive);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
import * as fs from "fs";
|
||||||
|
import {O_RDONLY, O_WRONLY, O_RDWR, O_CREAT } from 'constants';
|
||||||
|
import { get_runtime, JavaScriptRuntime } from "./env";
|
||||||
|
|
||||||
|
class NodeJSFileAccess extends FileAccess {
|
||||||
|
|
||||||
|
protected fd: number = -1;
|
||||||
|
protected pos: number = 0;
|
||||||
|
|
||||||
|
constructor(path, flags: number) {
|
||||||
|
super();
|
||||||
|
this.fd = fs.openSync(path, flags);
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(): void {
|
||||||
|
fs.closeSync(this.fd);
|
||||||
|
};
|
||||||
|
|
||||||
|
static exists(path: string): boolean {
|
||||||
|
return fs.existsSync(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static open(path: string, mode_flags: ModeFlags): NodeJSFileAccess {
|
||||||
|
let flags = 0;
|
||||||
|
switch (mode_flags) {
|
||||||
|
case ModeFlags.READ:
|
||||||
|
flags = O_RDONLY;
|
||||||
|
break;
|
||||||
|
case ModeFlags.WRITE:
|
||||||
|
flags = O_CREAT | O_WRONLY;
|
||||||
|
break;
|
||||||
|
case ModeFlags.READ_WRITE:
|
||||||
|
flags = O_CREAT | O_RDWR;
|
||||||
|
break;
|
||||||
|
case ModeFlags.WRITE_READ:
|
||||||
|
flags = O_CREAT | O_RDWR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return new NodeJSFileAccess(path, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
get_len(): number {
|
||||||
|
return fs.statSync(this.path).size;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_as_utf8_string(): string {
|
||||||
|
return fs.readFileSync(this.path, {encoding: 'utf-8'});
|
||||||
|
}
|
||||||
|
|
||||||
|
save_as_utf8_string(text: string) {
|
||||||
|
return fs.writeFileSync(this.path, text, {encoding: 'utf-8'});
|
||||||
|
}
|
||||||
|
|
||||||
|
get_as_array(): Uint8Array {
|
||||||
|
let buff = fs.readFileSync(this.path);
|
||||||
|
return buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
save_as_array(buffer: Uint8Array) {
|
||||||
|
fs.writeFileSync(this.path, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export class NodeJSDirAccess extends DirAccess {
|
||||||
|
static exists(path: string): boolean {
|
||||||
|
return fs.statSync(path).isDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
static make_dir(p_dir: string, recursive: boolean = false) {
|
||||||
|
fs.mkdirSync(p_dir, {recursive: true});
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/tiny/path.ts
Normal file
54
src/tiny/path.ts
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* 对文件路径的一些操作,针对的是 C:/A/B/C/D/example.ts这种格式
|
||||||
|
*/
|
||||||
|
export const path = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化文件路径,"C:/A/B//C//D//example.ts"=>"C:/A/B/C/D/example.ts"
|
||||||
|
* @param filename 传入的文件路径
|
||||||
|
*/
|
||||||
|
normalize: (filename: string): string => {
|
||||||
|
const arr = filename.split("/");
|
||||||
|
return arr.filter((value, index) => !!value || index == arr.length - 1).join("/");
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据文件路径得到文件名字,"C:/A/B/example.ts"=>"example.ts"
|
||||||
|
* @param filename 传入的文件路径
|
||||||
|
* @return 文件的名字
|
||||||
|
*/
|
||||||
|
basename: (filename: string): string => {
|
||||||
|
return filename.substr(filename.lastIndexOf("/") + 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件所在文件夹路径,"C:/A/B/example.ts"=>"C:/A/B"
|
||||||
|
* @param path 传入的文件路径
|
||||||
|
* @return 文件所在文件夹的地址
|
||||||
|
*/
|
||||||
|
dirname: (path: string): string => {
|
||||||
|
return path.substr(0, path.lastIndexOf("/"));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得文件拓展名 " text.txt" => "txt"
|
||||||
|
* @param path 传入的文件路径
|
||||||
|
*/
|
||||||
|
extension: (filename: string): string => {
|
||||||
|
let pos = filename.lastIndexOf('.');
|
||||||
|
if (pos >= 0 && pos < filename.length - 1) {
|
||||||
|
return filename.substring(pos + 1, filename.length);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
|
||||||
|
join(dir: string, ...pathes: string[]) {
|
||||||
|
let ret = dir;
|
||||||
|
for (const p of pathes) {
|
||||||
|
if (p) {
|
||||||
|
ret += '/' + p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user