Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۳ دقیقه·۴ سال پیش

فایل سیستم در نود.جی‌اس

اگه از اون دسته دولوپرایی هستی که اهل استفاده از کد های سنکرون در کنار آسنکرون هستی، اگه یه همچین کدی میزنی:

if (fs.existsSync('path-to-file')) { fs.appendFile('path-to-file', 'data++', error => console.error(error)); };

باید بگم من همچین کدی نمیزنم. چراکه معتقد هستم نباید تو نود.جی‌اس پروسه رو بلاک کرد.


چک کردن اینکه فایل وجود داره یا نه

برای این موضوع شما دو راه داری:

  1. از پکیج های third party استفاده بکنی.
  2. از خود نود.جی‌اس استفاده بکنی.

اینجی من میام از خود نود.جی‌اس استفاده می‌کنم. خب برای این کار شما می‌تونی از fs.stat و fs.access استفاده بکنم. ولی اگه میخوای به پیشنهاد دولوپرای خود نود.جی‌اس عمل بکنید بهتره که این کارو نکنید. یعنی اگه میخوای یکی از عملیات های write/delete/read رو انجام بدی بهتره بری سمت ارور هندلینگ تا اینکه بیای یه لاجیک دیگه اضافه بکنی. مثلا تو یه تابع این کد رو مینویسی:

try { let publicKey = await fsPromises.readFile('id_rsa_public.pem'); let privateKey = await fsPromises.readFile('id_rsa_private.pem'); return { publicKey, privateKey }; } catch (error) { if(error.code === 'ENOENT') { let keyPair = await generateKeyPair('rsa', { privateKeyEncoding: { type: 'pkcs1', format: 'pem' }, publicKeyEncoding: { type: 'pkcs1', format: 'pem' }, modulusLength: 4096, }); await fsPromises.writeFile(path.join(__dirname, 'id_rsa_public.pem'), keyPair.publicKey); await fsPromises.writeFile(path.join(__dirname, 'id_rsa_private.pem'), eyPair.privateKey); return { publicKey, privateKey }; }; };

به جای اینکه چک کنم فایل وجو داره یا نه اومدم ارور رو هندل کردم. هر چند این روش برای خودمم عجیبه ولی به نظرم اگه با ورژن callback ای readFile استفاده بشه قشنگ تر و ساده تر میشه.


چک کردن محتوای یه دایرکتوری

دستور readdir میاد محتوای فایل رو میخونه و بر میگردونه. یه مسیری بهش میدی با یسری آپشن.

مسیر

میتونه یه URL یا بافر یا رشته میتونه باشه که مشخص میکنه فایل کجاست.

آپشن ها

مورد اول encoding هست که یه رشته میگیره و مقدار پیشفرض اون utf8 هست. مورد بعدی withFileTypes هست که مشخص میکنه فایل برگشت داده شده باید به عنوان آبجکت های fs.Dirent برگردونده بشه.


fs.Dirent

نمایش دادن محتوای دایرکتوری به صورت فایل ها و subdirectory ها. وقتی که fs.readdir میکنی و withFileTypes رو true میزاری مقدار بازگشتی یک نمونه از این کلاس هست.

const { promises: fsPromises } = require('fs'); (async _ => { let res = await fsPromises.readdir('.', { withFileTypes: true }); console.log(res[0].name); console.log(res[0].isDirectory()); console.log(res[0].isFile()); })();

با این دستور میای اسم فایل/دایرکتوری رو بعلاوه چندین متد سودمند دیگه بدست میاری.

fsnode jsnodejs
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید