Rumah >hujung hadapan web >tutorial js >Bekerja dengan sistem fail di Deno
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 utamaDeno.readDir
untuk membaca kandungan fail, dengan itu memudahkan interaksi sistem fail tanpa import tambahan. Deno.readTextFile
path.join
–allow-read
untuk melaksanakan operasi sistem fail, yang meningkatkan keselamatan dengan mengawal fungsi skrip. –allow-write
deno compile
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
<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:
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!
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>
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!