目录操作 #
一、目录操作概述 #
Deno提供了完整的目录操作API,包括创建、遍历、删除目录等功能。
二、创建目录 #
2.1 基本创建 #
typescript
// 创建目录
await Deno.mkdir("./output");
// 同步创建
Deno.mkdirSync("./output");
2.2 递归创建 #
typescript
// 递归创建多级目录
await Deno.mkdir("./output/logs/2024", { recursive: true });
// 同步创建
Deno.mkdirSync("./output/logs/2024", { recursive: true });
2.3 创建临时目录 #
typescript
// 创建临时目录
const tempDir = await Deno.makeTempDir();
console.log(tempDir); // /tmp/deno-xxx
// 指定前缀和后缀
const tempDir2 = await Deno.makeTempDir({
prefix: "myapp_",
suffix: "_temp"
});
// 在指定目录创建
const tempDir3 = await Deno.makeTempDir({
dir: "./temp"
});
三、遍历目录 #
3.1 读取目录内容 #
typescript
// 读取目录
for await (const entry of Deno.readDir("./src")) {
console.log(entry.name);
console.log(" isFile:", entry.isFile);
console.log(" isDirectory:", entry.isDirectory);
console.log(" isSymlink:", entry.isSymlink);
}
3.2 同步读取 #
typescript
// 同步读取目录
for (const entry of Deno.readDirSync("./src")) {
console.log(entry.name);
}
3.3 递归遍历 #
typescript
async function walk(dir: string): Promise<string[]> {
const files: string[] = [];
for await (const entry of Deno.readDir(dir)) {
const path = `${dir}/${entry.name}`;
if (entry.isDirectory) {
files.push(...await walk(path));
} else {
files.push(path);
}
}
return files;
}
const allFiles = await walk("./src");
console.log(allFiles);
3.4 使用标准库 #
typescript
import { walk } from "https://deno.land/std@0.208.0/fs/walk.ts";
// 遍历目录
for await (const entry of walk("./src")) {
console.log(entry.path);
}
// 过滤文件类型
for await (const entry of walk("./src", { exts: [".ts"] })) {
console.log(entry.path);
}
// 包含隐藏文件
for await (const entry of walk("./src", { includeDirs: false })) {
console.log(entry.path);
}
四、目录信息 #
4.1 获取目录状态 #
typescript
const info = await Deno.stat("./src");
console.log("是否目录:", info.isDirectory);
console.log("修改时间:", info.mtime);
console.log("访问时间:", info.atime);
4.2 检查目录是否存在 #
typescript
async function isDirectory(path: string): Promise<boolean> {
try {
const info = await Deno.stat(path);
return info.isDirectory;
} catch {
return false;
}
}
console.log(await isDirectory("./src"));
4.3 获取当前目录 #
typescript
// 获取当前工作目录
const cwd = Deno.cwd();
console.log(cwd);
// 切换工作目录
Deno.chdir("./src");
console.log(Deno.cwd());
五、删除目录 #
5.1 删除空目录 #
typescript
// 删除空目录
await Deno.remove("./empty-dir");
// 同步删除
Deno.removeSync("./empty-dir");
5.2 递归删除 #
typescript
// 递归删除目录及其内容
await Deno.remove("./output", { recursive: true });
// 同步删除
Deno.removeSync("./output", { recursive: true });
六、路径操作 #
6.1 路径解析 #
typescript
import { join, resolve, dirname, basename, extname } from "https://deno.land/std@0.208.0/path/mod.ts";
// 连接路径
const fullPath = join("./src", "utils", "mod.ts");
console.log(fullPath); // src/utils/mod.ts
// 解析绝对路径
const absolute = resolve("./src/mod.ts");
console.log(absolute); // /Users/xxx/project/src/mod.ts
// 获取目录名
const dir = dirname("./src/utils/mod.ts");
console.log(dir); // ./src/utils
// 获取文件名
const base = basename("./src/utils/mod.ts");
console.log(base); // mod.ts
// 获取扩展名
const ext = extname("./src/utils/mod.ts");
console.log(ext); // .ts
6.2 路径规范化 #
typescript
import { normalize, relative, isAbsolute } from "https://deno.land/std@0.208.0/path/mod.ts";
// 规范化路径
const normalized = normalize("./src/../src/./utils");
console.log(normalized); // src/utils
// 获取相对路径
const rel = relative("/Users/xxx/project/src", "/Users/xxx/project/test");
console.log(rel); // ../test
// 检查是否绝对路径
console.log(isAbsolute("/Users/xxx")); // true
console.log(isAbsolute("./src")); // false
七、实际应用 #
7.1 项目结构生成 #
typescript
async function createProject(name: string): Promise<void> {
const dirs = [
name,
`${name}/src`,
`${name}/src/utils`,
`${name}/src/types`,
`${name}/tests`,
`${name}/docs`
];
for (const dir of dirs) {
await Deno.mkdir(dir, { recursive: true });
}
const files = {
[`${name}/deno.json`]: JSON.stringify({
name,
version: "1.0.0",
tasks: {
dev: "deno run --watch src/mod.ts",
test: "deno test --allow-all"
}
}, null, 2),
[`${name}/src/mod.ts`]: "// Main module\n",
[`${name}/README.md`]: `# ${name}\n\nProject description.\n`
};
for (const [path, content] of Object.entries(files)) {
await Deno.writeTextFile(path, content);
}
console.log(`Project ${name} created!`);
}
await createProject("my-project");
7.2 文件搜索 #
typescript
import { walk } from "https://deno.land/std@0.208.0/fs/walk.ts";
async function findFiles(
dir: string,
pattern: RegExp
): Promise<string[]> {
const matches: string[] = [];
for await (const entry of walk(dir)) {
if (pattern.test(entry.path)) {
matches.push(entry.path);
}
}
return matches;
}
const tsFiles = await findFiles("./src", /\.ts$/);
console.log(tsFiles);
7.3 目录大小统计 #
typescript
async function getDirSize(dir: string): Promise<number> {
let size = 0;
for await (const entry of walk(dir, { includeDirs: false })) {
const info = await Deno.stat(entry.path);
size += info.size;
}
return size;
}
const size = await getDirSize("./src");
console.log(`Size: ${(size / 1024).toFixed(2)} KB`);
八、总结 #
本章学习了:
- 创建目录
- 遍历目录内容
- 获取目录信息
- 删除目录
- 路径操作
- 实际应用场景
下一章,我们将学习文件监控。
最后更新:2026-03-28