在本页
文件系统 API
Deno Deploy 支持 Deno 中提供的有限的文件系统 API 集。这些文件系统 API 可以访问部署中的静态文件。静态文件例如
- 如果您通过 GitHub 集成进行部署,则为 GitHub 存储库中的文件。
- 游乐场部署中的入口点文件。
可用的 API 是
- Deno.cwd
- Deno.readDir
- Deno.readFile
- Deno.readTextFile
- Deno.open
- Deno.stat
- Deno.lstat
- Deno.realPath
- Deno.readLink
Deno.cwd 跳转到标题
Deno.cwd()
返回部署的当前工作目录。它位于部署根目录的根目录。例如,如果您通过 GitHub 集成进行部署,则当前工作目录是 GitHub 存储库的根目录。
Deno.readDir 跳转到标题
Deno.readDir()
允许您列出目录的内容。
该函数与 Deno 完全兼容。
function Deno.readDir(path: string | URL): AsyncIterable<DirEntry>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例列出目录的内容,并将此列表作为 JSON 对象返回到响应主体中。
async function handler(_req) {
// List the posts in the `blog` directory located at the root
// of the repository.
const posts = [];
for await (const post of Deno.readDir(`./blog`)) {
posts.push(post);
}
// Return JSON.
return new Response(JSON.stringify(posts, null, 2), {
headers: {
"content-type": "application/json",
},
});
}
Deno.serve(handler);
Deno.readFile 跳转到标题
Deno.readFile()
允许您将文件完全读入内存。
函数定义类似于 Deno,但目前不支持 ReadFileOptions
。将来会添加支持。
function Deno.readFile(path: string | URL): Promise<Uint8Array>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例将文件内容作为字节数组读入内存,然后将其作为响应主体返回。
async function handler(_req) {
// Let's read the README.md file available at the root
// of the repository to explore the available methods.
// Relative paths are relative to the root of the repository
const readmeRelative = await Deno.readFile("./README.md");
// Absolute paths.
// The content of the repository is available under at Deno.cwd().
const readmeAbsolute = await Deno.readFile(`${Deno.cwd()}/README.md`);
// File URLs are also supported.
const readmeFileUrl = await Deno.readFile(
new URL(`file://${Deno.cwd()}/README.md`),
);
// Decode the Uint8Array as string.
const readme = new TextDecoder().decode(readmeRelative);
return new Response(readme);
}
Deno.serve(handler);
注意:要使用此功能,您必须将 GitHub 存储库链接到您的项目。
Deno Deploy 支持 Deno.readFile
API 从文件系统读取静态资产。这对于提供静态资产(如图像、样式表和 JavaScript 文件)很有用。本指南演示如何使用此功能。
想象一下 GitHub 存储库上的以下文件结构
├── mod.ts
└── style.css
mod.ts
的内容
async function handleRequest(request: Request): Promise<Response> {
const { pathname } = new URL(request.url);
// This is how the server works:
// 1. A request comes in for a specific asset.
// 2. We read the asset from the file system.
// 3. We send the asset back to the client.
// Check if the request is for style.css.
if (pathname.startsWith("/style.css")) {
// Read the style.css file from the file system.
const file = await Deno.readFile("./style.css");
// Respond to the request with the style.css file.
return new Response(file, {
headers: {
"content-type": "text/css",
},
});
}
return new Response(
`<html>
<head>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Example</h1>
</body>
</html>`,
{
headers: {
"content-type": "text/html; charset=utf-8",
},
},
);
}
Deno.serve(handleRequest);
提供给 Deno.readFile
API 的路径相对于存储库的根目录。您也可以指定绝对路径,前提是它们位于 Deno.cwd
内。
Deno.readTextFile 跳转到标题
此函数类似于 Deno.readFile,但它将文件内容解码为 UTF-8 字符串。
function Deno.readTextFile(path: string | URL): Promise<string>
示例 跳转到标题
此示例将文本文件读入内存,并将内容作为响应主体返回。
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,但目前不支持 OpenOptions
。将来会添加支持。
function Deno.open(path: string | URL): Promise<Deno.File>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例打开一个文件,然后将内容作为响应主体流式传输。
async function handler(_req) {
// Open the README.md file available at the root of the repository.
const file = await Deno.open("./README.md");
// Use the `readable` property, which is a `ReadableStream`. This will
// automatically close the file handle when the response is done sending.
return new Response(file.readable);
}
Deno.serve(handler);
Deno.File 跳转到标题
Deno.File
是从 Deno.open()
返回的文件句柄。可以使用 read()
方法读取文件的块。可以使用 close()
方法关闭文件句柄。
该接口类似于 Deno,但它不支持写入文件或查找。将来会添加对后者的支持。
class File {
readonly rid: number;
close(): void;
read(p: Uint8Array): Promise<number | null>;
}
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
Deno.File#read() 跳转到标题
read 方法用于读取文件的块。它应该传递一个缓冲区来读取数据。它返回读取的字节数或 null
(如果已到达文件末尾)。
function read(p: Uint8Array): Promise<number | null>;
Deno.File#close() 跳转到标题
close 方法用于关闭文件句柄。关闭句柄将中断所有正在进行的读取操作。
function close(): void;
Deno.stat 跳转到标题
Deno.stat()
读取文件系统条目元数据。它返回一个 Deno.FileInfo
对象。符号链接将被跟随。
函数定义与 Deno 相同。它不返回修改时间、访问时间或创建时间值。
function Deno.stat(path: string | URL): Promise<Deno.FileInfo>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例获取文件的大小,并将结果作为响应主体返回。
async function handler(_req) {
// Get file info of the README.md at the root of the repository.
const info = await Deno.stat("./README.md");
// Get the size of the file in bytes.
const size = info.size;
return new Response(`README.md is ${size} bytes large`);
}
Deno.serve(handler);
Deno.lstat 跳转到标题
Deno.lstat()
类似于 Deno.stat()
,但它不跟随符号链接。
函数定义与 Deno 相同。它不返回修改时间、访问时间或创建时间值。
function Deno.lstat(path: string | URL): Promise<Deno.FileInfo>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
Deno.FileInfo 跳转到标题
Deno.FileInfo
接口用于表示文件系统条目的元数据。它由 Deno.stat()
和 Deno.lstat()
函数返回。它可以表示文件、目录或符号链接。
在 Deno Deploy 中,只有文件类型和大小属性可用。大小属性的行为与 Linux 上相同。
interface FileInfo {
isDirectory: boolean;
isFile: boolean;
isSymlink: boolean;
size: number;
}
Deno.realPath 跳转到标题
Deno.realPath()
返回解析后的文件绝对路径,包括符号链接。
函数定义与 Deno 相同。
function Deno.realPath(path: string | URL): Promise<string>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例调用 Deno.realPath()
获取存储库根目录中文件的绝对路径。结果作为响应主体返回。
async function handler(_req) {
const path = await Deno.realPath("./README.md");
return new Response(`The fully resolved path for ./README.md is ${path}`);
}
Deno.serve(handler);
Deno.readLink 跳转到标题
Deno.readLink()
返回符号链接的目标路径。
函数定义与 Deno 相同。
function Deno.readLink(path: string | URL): Promise<string>
路径可以是相对路径或绝对路径。它也可以是 file:
URL。
示例 跳转到标题
此示例调用 Deno.readLink()
获取存储库根目录中文件的绝对路径。结果作为响应主体返回。
async function handler(_req) {
const path = await Deno.readLink("./my_symlink");
return new Response(`The target path for ./my_symlink is ${path}`);
}
Deno.serve(handler);