目录操作 #

一、目录操作概述 #

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