---
title: "文件系统 API"
oldUrl:
- /deploy/docs/runtime-fs/
- /deploy/manual/runtime-fs/
- /deploy/api/runtime-fs/
---
:::info 旧版文档
您正在查看 Deno Deploy Classic 的旧版文档。我们建议
迁移到新的
Deno Deploy 平台。
:::
Deno Deploy Classic 支持Deno中的有限文件系统 API 集。这些文件系统 API 可以访问您部署中的静态文件。静态文件例如:
- 如果您通过 GitHub 集成进行部署,则为您的 GitHub 存储库中的文件。
- 在 playground 部署中的入口文件。
可用的 API 有:
- [Deno.cwd](#deno.cwd)
- [Deno.readDir](#deno.readdir)
- [Deno.readFile](#deno.readfile)
- [Deno.readTextFile](#deno.readtextfile)
- [Deno.open](#deno.open)
- [Deno.stat](#deno.stat)
- [Deno.lstat](#deno.lstat)
- [Deno.realPath](#deno.realpath)
- [Deno.readLink](#deno.readlink)
## Deno.cwd
`Deno.cwd()` 返回您部署的当前工作目录。它位于您部署根目录的根部。例如,如果您通过 GitHub 集成进行部署,则当前工作目录是您 GitHub 存储库的根部。
## Deno.readDir
`Deno.readDir()` 允许您列出目录的内容。
该函数与 [Deno](https://docs.deno.com/api/deno/~/Deno.readDir) 完全兼容。
```ts
function Deno.readDir(path: string | URL): AsyncIterable
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例列出目录的内容,并将此列表作为 JSON 对象返回到响应正文中。
```js
async function handler(_req) {
// 列出位于存储库根目录中的 `blog` 目录中的文章。
const posts = [];
for await (const post of Deno.readDir(`./blog`)) {
posts.push(post);
}
// 返回 JSON。
return new Response(JSON.stringify(posts, null, 2), {
headers: {
"content-type": "application/json",
},
});
}
Deno.serve(handler);
```
## Deno.readFile
`Deno.readFile()` 允许您将文件完全读入内存。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.readFile) 类似,但目前不支持 [`ReadFileOptions`](https://docs.deno.com/api/deno/~/Deno.ReadFileOptions)。未来将添加支持。
```ts
function Deno.readFile(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例将文件内容读入内存作为字节数组,然后将其作为响应正文返回。
```js
async function handler(_req) {
// 让我们读取位于存储库根目录中的 README.md 文件,以探索可用的方法。
// 相对路径是相对于存储库的根部
const readmeRelative = await Deno.readFile("./README.md");
// 绝对路径。
// 存储库的内容可以在 Deno.cwd() 下获得。
const readmeAbsolute = await Deno.readFile(`${Deno.cwd()}/README.md`);
// 文件 URL 也受到支持。
const readmeFileUrl = await Deno.readFile(
new URL(`file://${Deno.cwd()}/README.md`),
);
// 将 Uint8Array 解码为字符串。
const readme = new TextDecoder().decode(readmeRelative);
return new Response(readme);
}
Deno.serve(handler);
```
> 注意:要使用此功能,您必须将 GitHub 存储库链接到您的项目。
Deno Deploy Classic 支持 `Deno.readFile` API 从文件系统中读取静态资源。这对于提供图像、样式表和 JavaScript 文件等静态资源非常有用。本指南演示了如何使用此功能。
假设在 GitHub 存储库中有以下文件结构:
```console
├── mod.ts
└── style.css
```
`mod.ts` 的内容:
```ts
async function handleRequest(request: Request): Promise {
const { pathname } = new URL(request.url);
// 服务器的工作方式:
// 1. 针对特定资产的请求到达。
// 2. 我们从文件系统中读取该资产。
// 3. 我们将资产发送回客户端。
// 检查请求是否是针对 style.css。
if (pathname.startsWith("/style.css")) {
// 从文件系统中读取 style.css 文件。
const file = await Deno.readFile("./style.css");
// 用 style.css 文件响应请求。
return new Response(file, {
headers: {
"content-type": "text/css",
},
});
}
return new Response(
`
示例
`,
{
headers: {
"content-type": "text/html; charset=utf-8",
},
},
);
}
Deno.serve(handleRequest);
```
提供给 [`Deno.readFile`](https://docs.deno.com/api/deno/~/Deno.readFile) API 的路径是相对于存储库的根部。您也可以指定绝对路径,前提是它们位于 `Deno.cwd` 内部。
## Deno.readTextFile
此函数类似于 [Deno.readFile](#Deno.readFile),不同之处在于它将文件内容解码为 UTF-8 字符串。
```ts
function Deno.readTextFile(path: string | URL): Promise
```
### 示例
此示例将文本文件读入内存,并将内容作为响应正文返回。
```js
async function handler(_req) {
const readme = await Deno.readTextFile("./README.md");
return new Response(readme);
}
Deno.serve(handler);
```
## Deno.open
`Deno.open()` 允许您打开一个文件,返回一个文件句柄。该文件句柄随后可用于读取文件的内容。有关文件句柄上可用方法的信息,请参见 [`Deno.File`](#deno.file)。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.open) 类似,但目前不支持 [`OpenOptions`](https://docs.deno.com/api/deno/~/Deno.OpenOptions)。未来将添加支持。
```ts
function Deno.open(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例打开一个文件,并将内容作为响应主体进行流式传输。
```js
async function handler(_req) {
// 打开位于存储库根部的 README.md 文件。
const file = await Deno.open("./README.md");
// 使用 `readable` 属性,这是一个 `ReadableStream`。这将在响应完成发送时自动关闭文件句柄。
return new Response(file.readable);
}
Deno.serve(handler);
```
:::note
当您按如下所示迭代文件流时,文件描述符将在迭代结束时自动关闭。无需手动关闭文件描述符:`const iterator = fd.readable[Symbol.asyncIterator]();`
:::
## Deno.File
`Deno.File` 是通过 [`Deno.open()`](#deno.open) 返回的文件句柄。它可以用于使用 `read()` 方法读取文件的块。可以使用 `close()` 方法关闭文件句柄。
该接口与 [Deno](https://docs.deno.com/api/deno/~/Deno.File) 类似,但不支持写入文件或寻址。对后者的支持将在未来添加。
```ts
class File {
readonly rid: number;
close(): void;
read(p: Uint8Array): Promise;
}
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
## Deno.File#read()
read 方法用于读取文件的一块。它应传递一个缓冲区以读取数据。它返回读取的字节数或 `null`(如果已到达文件末尾)。
```ts
function read(p: Uint8Array): Promise;
```
### Deno.File#close()
close 方法用于关闭文件句柄。关闭句柄将中断所有正在进行的读取。
```ts
function close(): void;
```
## Deno.stat
`Deno.stat()` 读取文件系统条目的元数据。它返回一个 [`Deno.FileInfo`](#fileinfo) 对象。符号链接会被跟随。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.stat) 相同。它不返回修改时间、访问时间或创建时间值。
```ts
function Deno.stat(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例获取文件的大小,并将结果作为响应主体返回。
```js
async function handler(_req) {
// 获取位于存储库根部的 README.md 的文件信息。
const info = await Deno.stat("./README.md");
// 获取文件的字节大小。
const size = info.size;
return new Response(`README.md 的大小为 ${size} 字节`);
}
Deno.serve(handler);
```
## Deno.lstat
`Deno.lstat()` 类似于 `Deno.stat()`,但它不跟随符号链接。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.lstat) 相同。它不返回修改时间、访问时间或创建时间值。
```ts
function Deno.lstat(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
## Deno.FileInfo
`Deno.FileInfo` 接口用于表示文件系统条目的元数据。它是由 [`Deno.stat()`](#deno.stat) 和 [`Deno.lstat()`](#deno.lstat) 函数返回的。它可以表示文件、目录或符号链接。
在 Deno Deploy Classic 中,仅支持文件类型和大小属性。
大小属性的行为与 Linux 上相同。
```ts
interface FileInfo {
isDirectory: boolean;
isFile: boolean;
isSymlink: boolean;
size: number;
}
```
## Deno.realPath
`Deno.realPath()` 返回解析后的绝对路径,经过符号链接的跟随。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.realPath) 相同。
```ts
function Deno.realPath(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例调用 `Deno.realPath()` 获取存储库根部文件的绝对路径。结果作为响应正文返回。
```js
async function handler(_req) {
const path = await Deno.realPath("./README.md");
return new Response(`./README.md 的完全解析路径为 ${path}`);
}
Deno.serve(handler);
```
## Deno.readLink
`Deno.readLink()` 返回符号链接的目标路径。
该函数的定义与 [Deno](https://docs.deno.com/api/deno/~/Deno.readLink) 相同。
```ts
function Deno.readLink(path: string | URL): Promise
```
路径可以是相对路径或绝对路径。它也可以是 `file:` URL。
### 示例
此示例调用 `Deno.readLink()` 获取存储库根部文件的绝对路径。结果作为响应正文返回。
```js
async function handler(_req) {
const path = await Deno.readLink("./my_symlink");
return new Response(`./my_symlink 的目标路径为 ${path}`);
}
Deno.serve(handler);
```