ホームページ > ウェブフロントエンド > jsチュートリアル > Denoのファイルシステムを操作します

Denoのファイルシステムを操作します

Jennifer Aniston
リリース: 2025-02-09 09:43:10
オリジナル
900 人が閲覧しました

Working with the File System in Deno

この記事は、デノに飛び込み、ファイルとフォルダーでテキストを検索するためのコマンドラインツールを作成します。 DENOが提供するさまざまなAPIメソッドを使用して、ファイルシステムを読み書きします。

前の記事では、Denoを使用してコマンドラインツールを構築して、サードパーティAPIにリクエストを行いました。この記事では、一時的にネットワーク操作を無視し、現在のディレクトリ内のファイルとフォルダー(GREPなどのツール内のテキストを検索できるツール)を構築します。

注:私たちが構築するツールは、GREPほど最適化されていて効率的ではなく、私たちはそれを交換することを目指していません!このようなツールを構築する目的は、DenoのファイルシステムAPIに精通することです。

キーポイント

  • DenoのファイルシステムAPIは、GREPツールと同様に、ファイルやディレクトリでテキストを検索するためのコマンドラインツールを作成するのに役立ちますが、最適化されていません。
  • denoでYargsを使用して、開発者はコマンドラインアプリケーション用のユーザーインターフェイスを構築し、指定されたディレクトリのテキスト検索を許可できます。
  • denoは、ファイルをリストするにはDeno.readDirなどの組み込み関数やファイルの内容を読み取るための機能を提供します。 Deno.readTextFile
  • denoのパスモジュールを使用して、ファイルパスなどの関数を含むファイルパスを効率的に管理できます。ファイルパスを接続できます。
  • path.joindenoスクリプトには、ファイルシステム操作を実行するには、
  • などの明示的な許可フラグが必要です。これは、スクリプト関数を制御することでセキュリティを強化します。 –allow-read –allow-write開発者は、
  • を使用してDenoスクリプトを個別の実行可能ファイルにコンパイルし、必要な権限をカプセル化することにより配布と実行を簡素化できます。
  • deno compile
  • インストールdeno

ローカルマシンでデノが走っていると仮定します。 DENOのウェブサイトまたは以前の記事では、詳細なインストール手順と編集者にDENOサポートを追加する方法に関する情報をご覧ください。

執筆時点では、Denoの最新の安定したバージョンは1.10.2です。これは、この記事で使用するバージョンです。

参照のために、GitHubでこの記事の完全なコードを見つけることができます。

Yargs

を使用して新しいコマンドを設定します

前の投稿と同様に、Yargsを使用して、ユーザーがツールを実行するために使用できるインターフェイスを構築します。 index.tsを作成して、次のように記入しましょう。

ここに指摘することがたくさんあります:

  • DENOリポジトリのパスを指すことにより、Yargsをインストールします。正確なバージョン番号を明示的に使用して、そのバージョンを常に取得することを確認して、スクリプトが実行されているときに最新のバージョンを使用しないようにします。
  • 執筆時点で、Deno TypeScriptはYargsで良い経験をしていなかったため、独自のインターフェイスを作成し、タイプの安全性を提供するために使用しました。
  • ユーザーアルグには、ユーザーから要求するすべての入力が含まれています。現在、テキスト入力のみを要求していますが、将来的には、現在のディレクトリを想定するのではなく、検索するファイルのリストを提供するために展開できます。

deno run index.tsで実行して、Yargs出力を見ることができます:

import yargs from "https://deno.land/x/yargs@v17.0.1-deno/deno.ts";

interface Yargs<argvreturntype></argvreturntype> {
  describe: (param: string, description: string) => Yargs<argvreturntype>;
</argvreturntype>  demandOption: (required: string[]) => Yargs<argvreturntype>;
</argvreturntype>  argv: ArgvReturnType;
}

interface UserArguments {
  text: string;
}

const userArguments: UserArguments =
  (yargs(Deno.args) as unknown as Yargs<userarguments>)
</userarguments>    .describe("text", "the text to search for within the current directory")
    .demandOption(["text"])
    .argv;

console.log(userArguments);
ログイン後にコピー
ログイン後にコピー

それを実装し始める時が来ました!

ファイルをリスト

特定のファイルでテキストの検索を開始する前に、検索するファイルのディレクトリとリストを生成する必要があります。 DenoはDeno.ReadDirを提供します。Deno.ReadDirは、「組み込み」ライブラリの一部であるため、インポートする必要はありません。グローバルネームスペースで利用できます。

deno.readdirは非同期であり、現在のディレクトリ内のファイルとフォルダーのリストを返します。これらのアイテムを非操作者として返します。つまり、結果を取得するためにループを待つために使用する必要があります。

このコードは、現在の作業ディレクトリ(deno.cwd()が提供)から各結果を読み取り、記録します。ただし、今すぐスクリプトを実行しようとすると、エラーが表示されます。
$ deno run index.ts
Check file:///home/jack/git/deno-file-search/index.ts
Options:
  --help     Show help                                                 [boolean]
  --version  Show version number                                       [boolean]
  --text     the text to search for within the current directory      [required]

Missing required argument: text
ログイン後にコピー

denoは、すべてのスクリプトがファイルシステムから読み取る権限を明示的に取得することを要求することを忘れないでください。私たちの場合、

フラグはコードを実行できるようにします:
for await (const fileOrFolder of Deno.readDir(Deno.cwd())) {
  console.log(fileOrFolder);
}
ログイン後にコピー

--allow-readこの場合、ビルドツールのディレクトリでスクリプトを実行するため、TSソースコード、.gitリポジトリ、および.vscodeフォルダーが見つかります。トップレベルのファイルだけでなく、ディレクトリ内のすべてのファイルを見つける必要があるため、この構造を再帰的にナビゲートするためにいくつかの機能を書き始めましょう。さらに、いくつかの一般的な無視を追加できます。スクリプトが.gitフォルダー全体を検索することを誰も望んでいないと思います!

$ deno run index.ts --text='foo'
error: Uncaught PermissionDenied: Requires read access to <cwd>, run again with the --allow-read flag
</cwd>for await (const fileOrFolder of Deno.readDir(Deno.cwd())) {
                                                   ^
    at deno:core/core.js:86:46
    at unwrapOpResult (deno:core/core.js:106:13)
    at Object.opSync (deno:core/core.js:120:12)
    at Object.cwd (deno:runtime/js/30_fs.js:57:17)
    at file:///home/jack/git/deno-file-search/index.ts:19:52
ログイン後にコピー
次のコードでは、getFilesList関数を作成します。これは、ディレクトリを取得し、そのディレクトリ内のすべてのファイルを返します。ディレクトリに遭遇した場合、ネストされたファイルを見つけて結果を返すために再帰的に呼び出されます。

次に、次のように使用できます

また、見栄えの良い出力を取得します:

~/$ deno run --allow-read index.ts --text='foo'
{ name: ".git", isFile: false, isDirectory: true, isSymlink: false }
{ name: ".vscode", isFile: false, isDirectory: true, isSymlink: false }
{ name: "index.ts", isFile: true, isDirectory: false, isSymlink: false }
ログイン後にコピー
パスモジュールを使用して

const IGNORED_DIRECTORIES = new Set([".git"]);

async function getFilesList(
  directory: string,
): Promise<string[]> {
  const foundFiles: string[] = [];
  for await (const fileOrFolder of Deno.readDir(directory)) {
    if (fileOrFolder.isDirectory) {
      if (IGNORED_DIRECTORIES.has(fileOrFolder.name)) {
        // Skip this folder, it's in the ignore list.
        continue;
      }
      // If it's not ignored, recurse and search this folder for files.
      const nestedFiles = await getFilesList(
        path.join(directory, fileOrFolder.name),
      );
      foundFiles.push(...nestedFiles);
    } else {
      // We found a file, so store it.
      foundFiles.push(path.join(directory, fileOrFolder.name));
    }
  }
  return foundFiles;
}
ログイン後にコピー
次のように、テンプレート文字列を使用してファイルパスを結合できるようになりました。

しかし、これはDenoのパスモジュールの方が良いでしょう。このモジュールは、DENOが標準ライブラリの一部として提供するモジュールの1つです(パスモジュールを使用してノードに非常に似ています)。ノードのパスモジュールを使用している場合、コードは非常に似ています。執筆時点では、Denoが提供する最新の標準ライブラリバージョンは0.97.0です。Mod.tsファイルからパスモジュールをインポートします:
const files = await getFilesList(Deno.cwd());
console.log(files);
ログイン後にコピー
import yargs from "https://deno.land/x/yargs@v17.0.1-deno/deno.ts";

interface Yargs<argvreturntype></argvreturntype> {
  describe: (param: string, description: string) => Yargs<argvreturntype>;
</argvreturntype>  demandOption: (required: string[]) => Yargs<argvreturntype>;
</argvreturntype>  argv: ArgvReturnType;
}

interface UserArguments {
  text: string;
}

const userArguments: UserArguments =
  (yargs(Deno.args) as unknown as Yargs<userarguments>)
</userarguments>    .describe("text", "the text to search for within the current directory")
    .demandOption(["text"])
    .argv;

console.log(userArguments);
ログイン後にコピー
ログイン後にコピー

mod.tsは、Denoの標準モジュールをインポートする際の常にエントリポイントです。このモジュールのドキュメントはDeno Webサイトにあり、Path.Joinをリストします。これにより、複数のパスを取り、1つのパスに結合します。関数を手動で組み合わせるのではなく、インポートして使用しましょう:

...(コードの残りの部分は、元のテキストで繰り返され、以前の出力で変更および最適化されているため、ここでは省略されています。)

...(コードの残りの部分は、オリジナルから繰り返され、以前の出力で既に変更および最適化されているため省略されています。 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: ::::::::::::::

以上がDenoのファイルシステムを操作しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート