Rumah >hujung hadapan web >tutorial js >Bekerja dengan sistem fail di Deno

Bekerja dengan sistem fail di Deno

Jennifer Aniston
Jennifer Anistonasal
2025-02-09 09:43:10894semak imbas

Working with the File System in Deno

Artikel ini akan menyelam ke Deno dan membuat alat baris arahan untuk mencari teks dalam fail dan folder. Kami akan menggunakan pelbagai kaedah API yang disediakan oleh Deno untuk membaca dan menulis kepada sistem fail.

Dalam artikel sebelumnya, kami membina alat baris arahan menggunakan Deno untuk membuat permintaan kepada API pihak ketiga. Dalam artikel ini, kami akan mengabaikan operasi rangkaian sementara dan membina alat yang membolehkan anda mencari teks dalam fail dan folder dalam direktori semasa - alat seperti GREP.

NOTA: Alat yang kami bina tidak dioptimumkan dan efisien seperti grep, dan kami tidak bertujuan untuk menggantikannya! Tujuan membina alat sedemikian adalah untuk mengenali API Sistem Fail Deno.

mata utama

    Sistem fail Fail Deno API membantu membuat alat baris arahan untuk mencari teks dalam fail dan direktori, sama dengan alat GREP, tetapi tidak dioptimumkan.
  • Menggunakan Yargs di Deno, pemaju boleh membina antara muka pengguna untuk aplikasi baris arahan, yang membolehkan carian teks dalam direktori tertentu.
  • Deno menyediakan fungsi terbina dalam seperti
  • untuk penyenaraian fail dan Deno.readDir untuk membaca kandungan fail, dengan itu memudahkan interaksi sistem fail tanpa import tambahan. Deno.readTextFile
  • Anda boleh menggunakan modul laluan Deno untuk menguruskan laluan fail dengan cekap, yang termasuk fungsi seperti
  • untuk menyambungkan laluan fail. path.join
  • skrip deno memerlukan bendera kebenaran yang jelas, seperti
  • atau –allow-read untuk melaksanakan operasi sistem fail, yang meningkatkan keselamatan dengan mengawal fungsi skrip. –allow-write
  • Pemaju boleh menggunakan
  • untuk menyusun skrip deno ke dalam executable berasingan, memudahkan pengedaran dan pelaksanaan dengan merangkumi keizinan yang diperlukan. deno compile
pemasangan deno

Kami menganggap bahawa anda mempunyai Deno berjalan di mesin tempatan anda. Anda boleh menyemak laman web DENO atau artikel sebelumnya untuk arahan pemasangan yang lebih terperinci dan maklumat mengenai cara menambah sokongan DENO kepada editor anda.

Pada masa penulisan, versi terkini Deno adalah 1.10.2, yang merupakan versi yang saya gunakan dalam artikel ini.

untuk rujukan, anda boleh mencari kod penuh untuk artikel ini di GitHub.

Tetapkan arahan baru dengan Yargs

Seperti dalam jawatan terdahulu, kami akan menggunakan Yargs untuk membina antara muka yang boleh digunakan pengguna untuk melaksanakan alat kami. Mari buat index.ts dan isi dengan yang berikut:

<code class="language-typescript">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);
</code>
Terdapat banyak perkara yang boleh ditunjukkan di sini:

  • Kami memasang Yargs dengan menunjuk ke laluan di repositori Deno. Saya secara eksplisit menggunakan nombor versi yang tepat untuk memastikan kami sentiasa mendapatkan versi itu supaya kami tidak menggunakan sebarang versi terkini apabila skrip sedang berjalan.
  • Pada masa penulisan, Deno Typescript tidak mempunyai pengalaman yang baik dengan Yargs, jadi saya mencipta antara muka saya sendiri dan menggunakannya untuk menyediakan beberapa jenis keselamatan.
  • userArguments mengandungi semua input yang akan kami minta dari pengguna. Pada masa ini, kami hanya meminta input teks, tetapi pada masa akan datang kami dapat mengembangkannya untuk menyediakan senarai fail untuk mencari, dan bukannya menganggap direktori semasa.

kita boleh menjalankannya dengan Deno Run Index.ts dan melihat output Yargs kami:

<code class="language-typescript">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);
</code>

Sudah tiba masanya untuk memulakan pelaksanaannya!

Senaraikan fail

Sebelum kita mula mencari teks dalam fail yang diberikan, kita perlu menghasilkan direktori dan senarai fail untuk dicari. Deno menyediakan Deno.Readdir, yang merupakan sebahagian daripada perpustakaan "terbina dalam", yang bermaksud anda tidak perlu mengimportnya. Ia boleh didapati di ruang nama global.

Deno.Readdir tidak segerak dan mengembalikan senarai fail dan folder dalam direktori semasa. Ia mengembalikan barang -barang ini sebagai asynciterator, yang bermaksud kita perlu menggunakan untuk menunggu ... gelung untuk mendapatkan hasilnya:

<code class="language-bash">$ 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</code>

Kod ini akan membaca dan merakam setiap hasil dari direktori kerja semasa (disediakan oleh deno.cwd ()). Walau bagaimanapun, jika anda cuba menjalankan skrip sekarang, anda akan menerima ralat:

<code class="language-typescript">for await (const fileOrFolder of Deno.readDir(Deno.cwd())) {
  console.log(fileOrFolder);
}
</code>

ingat bahawa Deno menghendaki semua skrip secara eksplisit memperoleh keizinan untuk dibaca dari sistem fail. Dalam kes kami, bendera --allow-read akan membolehkan kod kami dijalankan:

<code class="language-bash">$ 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</code>

Dalam kes ini, saya menjalankan skrip dalam direktori alat binaan, jadi ia mendapati kod sumber TS, repositori .git, dan folder .vscode. Mari mula menulis beberapa fungsi untuk menavigasi struktur ini secara rekursif, kerana kita perlu mencari semua fail dalam direktori, bukan hanya fail peringkat atas. Di samping itu, kita boleh menambah beberapa perkara biasa. Saya tidak fikir sesiapa yang mahu skrip mencari keseluruhan folder.

Dalam kod berikut, kami membuat fungsi getFilesList, yang mengambil direktori dan mengembalikan semua fail dalam direktori itu. Sekiranya direktori ditemui, ia akan memanggil semula dirinya untuk mencari sebarang fail bersarang dan mengembalikan hasilnya:

<code class="language-bash">~/$ 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 }
</code>

maka kita boleh menggunakannya seperti ini:

<code class="language-typescript">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;
}
</string></code>

kami juga mendapat beberapa output yang kelihatan baik:

<code class="language-typescript">const files = await getFilesList(Deno.cwd());
console.log(files);
</code>

menggunakan modul jalan

kita kini boleh menggabungkan laluan fail menggunakan rentetan templat seperti berikut:

<code class="language-bash">$ deno run --allow-read index.ts --text='foo'
[
  "/home/jack/git/deno-file-search/.vscode/settings.json",
  "/home/jack/git/deno-file-search/index.ts"
]
</code>

tetapi ini lebih baik dengan modul jalan Deno. Modul ini adalah salah satu modul Deno yang ditawarkan sebagai sebahagian daripada perpustakaan standardnya (sangat serupa dengan nod menggunakan modul Path), dan jika anda telah menggunakan modul laluan Node, kod itu kelihatan sangat serupa. Pada masa penulisan, versi perpustakaan standard terkini yang disediakan oleh Deno ialah 0.97.0, kami mengimport modul laluan dari fail mod.ts:

<code class="language-typescript">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);
</code>

mod.ts sentiasa menjadi titik masuk apabila mengimport modul standard Deno. Dokumentasi untuk modul ini terletak di laman web Deno dan menyenaraikan Path.join, yang akan mengambil pelbagai laluan dan menyertai mereka ke dalam satu jalan. Mari kita import dan gunakan fungsi dan bukannya menggabungkannya secara manual:

... (selebihnya kod ditinggalkan di sini kerana ia diulang dengan teks asal dan telah diubahsuai dan dioptimumkan dalam output sebelumnya.)

... (selebihnya kod ditinggalkan kerana ia berulang dari asal dan telah diubahsuai dan dioptimumkan dalam output sebelumnya.)

::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::

Atas ialah kandungan terperinci Bekerja dengan sistem fail di Deno. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn