زبان برنامه نویسی جاوا اسکریپت مدت زمان زیادی است که از بهترین زبانهای برنامه نویسی محسوب میشود، اما برای این زبان در ابتدا محدودیتهایی در توسعه سمت سرور وجود داشت. با ورد «نود جی اس» (Node.js) این محدودیت از بین رفت و هماکنون با استفاده از آن توسعه برنامههای سمت سرور با جاوا اسکریپت کاملاً فراهم است. در این مطلب از مجله تم آف در مورد ماژول FS در Node.js که به عنوان «سیستم فایل» (File System) نود جی اس از آن یاد میشود، توضیحاتی مطلوبی همراه با مثالهای عملی برای هر بخش ارائه خواهد شد. قبل از اینکه از این ماژول FS در نود جی اس سخن به میان آید ابتدا بهتر است در مورد خود نود جی اس و رسالت آن در دنیای توسعه وب توضیحاتی مختصر ارائه شود.
مقدمه و پیش درآمد آموزش ماژول FS در Node.js
در این بخش ابتدا برخی از پیشنیازها و مقدمات لازم برای آموزش ماژول FS در Node.js به طور خلاصه شرح داده میشود و سپس بلافاصله به سراغ بحث اصلی خواهیم رفت. لازم است در اینجا به این نکته اشاره شود که برای آموزش ماژول FS در Node.js یک دوره آموزشی اختصاصی در پلتفرم تم آف تولید و ارائه شده است که در صورت تمایل مخاطبان میتوانند برای یادگیری ماژول FS در Node.js از آن استفاده کنند.
نود جی اس چیست؟
Node.js نوعی محیط زمان اجرای جاوا اسکریپت منبع آزاد به حساب میآید که میتواند به صورت رایگان در سیستمعاملهای اصلی مانند ویندوز، مک و لینوکس دانلود و نصب شود. محبوبیت آن در سالهای اخیر بهشدت افزایش یافته است و فرصتهای هیجانانگیزی را برای توسعهدهندگان جاوا اسکریپت که به دنبال توسعه برنامههای سمت سرور هستند، ارائه میدهد.
با Node.js میتوان از جاوا اسکریپت برای برنامه نویسی سمت کلاینت و برنامه نویسی سمت سرور استفاده کرد. این بدان معناست که میتوان برنامههای سریع، مقیاسپذیر و کارآمد را با استفاده از زبانی واحد توسعه داد. معماری رویداد محور Node.js امکان برنامه نویسی ناهمگام در جاوا اسکریپت را فراهم و این ویژگی آن را برای مدیریت اتصالات همزمان و برنامههای بلادرنگ به گزینهای عالی تبدیل میکند.
Node.js به توسعهدهندگان جاوا اسکریپت این قدرت را میدهد تا مهارتهای خود را گسترش دهند و طیف گستردهای از برنامههای سمت سرور را بسازند. تطبیقپذیری و سهولت استفاده از آن، نود جی اس را به گزینهای مناسب برای سازندگان اپلیکیشن تبدیل کرده و راه را برای چشمانداز شغلی جدیدی را در زمینه برنامه نویسی جاوا اسکریپت هموار کرده است.
در ادامه این مطلب به رسالت ماژول FS در Node.js یا به عبارتی به سیستم مدیریت فایل در Node.js پرداخته خواهد شد. با APIهایی که نود جی اس در اختیار توسعهدهندگان قرار میدهد، پیمایش در سیستم فایل به سرعت انجام خواهد شد و توسعهدهنده قادر است تا بسیاری از عملیات پیچیده را بدون زحمت انجام دهد. تسلط بر این مهارتها، نه تنها بهرهوری توسعهدهنده را افزایش میدهد، بلکه به او قدرت خواهد داد تا از پتانسیل کامل تعاملات سیستم فایل نیز استفاده کند.
پیش نیازهای آموزش ماژول FS در Node.js کدامند؟
قبل از ورود به دنیای سیستم فایل Node.js، چند پیشنیاز وجود دارد که باید آنها در نظر داشت. اول از همه، باید Node.js را روی سیستمعامل خود نصب کرد. شگفتی Node.js در سادگی آن نهفته است، زیرا میتوان آن را به راحتی دانلود و بدون نیاز به سختافزار پیچیده بر روی کامپیوتر با سیستمعاملهای مختلف نصب کرد. علاوه بر این، داشتن درک اولیه از جاوا اسکریپت برای کار با ماژولهای Node.js مانند سیستم فایل FS ضروری است. همچنین آشنایی با مفاهیمی مانند توابع جاوا اسکریپت، توابع «فراخوانی» (Callback) و «وعدهها» (Promise) در جاوا اسکریپت، درک کاربران از این موضوع را تسریع میکند و به آنها این امکان را میدهد که از ماژول اف اس در Node.js نهایت استفاده را ببرند.
ماژول FS در Node.js
در توسعه برنامههای فولاستک، مدیریت فایلها و دایرکتوریها ضرورتی اساسی است. خواه برنامه به کاربران امکان آپلود تصاویر، رزومهها یا فایلهای دیگر را در سرور بدهد یا برنامه نیاز به توانایی خواندن فایلهای پیکربندی، جابجایی فایلها یا حتی تغییر مجوزهای آنها را به صورت برنامهای داشته باشد، مدیریت سیستم فایل نقش مهمی ایفا میکند.
خوشبختانه، با ماژول FS در نود جی اس تمام این وظایف به طور یکپارچه انجام میشوند. این ماژول قدرتمند طیف وسیعی از APIها را ارائه میدهد که به توسعهدهنده این امکان را خواهتد داد تا بدون زحمت با سیستمهای فایل تعامل داشته باشد. APIها ابزارهایی همهکاره هستند و گزینهها و پیکربندیهای قابل تنظیمی را برای انجام عملیات با نیازهای خاص برنامه ارائه میدهند.
علاوه بر این، بسته به نیاز برنامه، این امکان وجود دارد که از عملیات فایل «ناهمگام» (Asynchronous) و «همگام» (Synchronous) استفاده شود. قبل از عمیقتر شدن در ماژول فایل سیستم در نود جی اس، نگاهی گذرا بر خود مفهوم ماژول Node.js خالی از لطف نیست.
آموزش Node.js: کار با فایل توسط ماژول fs — بخش نهم
ماژول نود جی اس چیست؟
ماژولهای Node.js به عنوان گنجینهای از عملکردهای قدرتمند ارائه شده از طرف APIها، آماده استفاده به وسیله برنامههای مصرف کننده هستند. به عنوان مثال، ماژول FS در نود جی اس به توسعهدهنده اجازه میدهد تا به طور یکپارچه با سیستم فایل تعامل داشته باشد. به طور مشابه، «ماژول HTTP» دامنهای از امکانات را باز میکند و توسعهدهنده را قادر میسازد سروری ایجاد کرده و عملیات مختلف دیگر را انجام دهد.
با Node.js، مجموعهای از ماژولها در دسترس هستند که پیچیدگیهای سطح پایین توسعه برنامه را از بین میبرند و به کاربران این قدرت را میدهند تا روی توسعه قسمتهای اصلی و کاربردی برنامه تمرکز کنند. از Node.js نسخه «١۴» به بعد، توسعهدهندگان آزادی ایجاد و استفاده از ماژولهای Node.js را به دو روش مجزا در اختیار دارند: «ماژولهای CommonJS» یا همان CJS و «ESM» یا همان «MJS» روشهای نام برده هستند. در این مطلب، در درجه اول سبک CommonJS بررسی خواهد شد و اینجا، جایی است که جادوی «برنامه نویسی ماژولار» (Modular Programming) را از نزدیک خواهیم دید.
آموزش ماژول FS در Node.js
این بخش مخصوص کار با فایلها در Node.js است. این شامل انجام عملیات مختلف بر روی فایلها و دایرکتوریها (پوشهها) خواهد بود. برای شروع کار، باید ماژول FS را به فایل منبع وارد کرد.
در شیوه یا سبک CommonJS با استفاده از متد require
میتوان به این مهم دست پیدا کرد. مثال زیر مفهوم گفته شده را بیان میکند.
const { writeFile } = require('fs/promises');
در «سینتکس» (Syntax) بالا به طور خاص، متد writeFile
از بسته FS/promises
ایمپورت شده است. همچنین در قطعه کد بالا از «متدهای وعده» (Promises Method) در جاوا اسکریپت استفاده شده، زیرا آنها جدیدترین موارد اضافه شده به ماژول FS در Node.js هستند. آنها راحتی کار کردن یکپارچه با کلمات کلیدی async/wait
را ارائه میدهند که منجر به کدهای واضحتر و مختصرتر میشود. علاوه بر متدهای وعده، گزینههای جایگزین دیگر مانند متدهای همزمان synchronous
و توابع callback
نیز در مثالهای بعدی بررسی خواهند شد.
نحوه ایجاد و نوشتن با ماژول اف اس در Node.js
فایل را میتوان با سه متد مختلف ایجاد کرد و در آن نوشت. این سه متد به صورت موارد زیر هستند:
- متد writeFile
- متد appendFile
- متد openFile
مهم نیست که کدام رویکرد استفاده میشود. برای این کار باید به سادگی مسیر فایل و محتوای مورد نظر را برای نوشتن ارائه داد. اگر فایل از قبل وجود داشته باشد، این متدها بهخوبی جایگزین محتوای موجود آن میشوند. از سوی دیگر، اگر فایل هنوز ساخته نشده است، این متدها به طور یکپارچه فایلی جدید ایجاد میکنند.
آموزش Node.js: درخواست های HTTP و وب سوکت — بخش هشتم
استفاده از متد writeFile برای نوشتن و ایجاد فایل
قطعه کد زیر استفاده از متد writeFile
را برای ایجاد و نوشتن در فایل نشان میدهد. برای انجام این کار باید فایلی به نام فرضی createFile.js
به منظور اجرای کد مربوطه ایجاد شود.
const { writeFile } = require('fs/promises');
async function writeToFile(fileName, data) {
try {
await writeFile(fileName, data);
console.log(`Wrote data to ${fileName}`);
} catch (error) {
console.error(`Got an error trying to write the file: ${error.message}`);
}
}
در مثال فوق از کلمه کلیدی await
برای فراخوانی متد استفاده شده است، زیرا یک «Promise» یا همان «وعده» جاوا اسکریپت را برمیگرداند. وعده موفق باعث انجام عمل ایجاد و نوشتن در فایل میشود. همچنین در قطعه کد بالا، بلوک try-catch
برای رسیدگی به خطاها در صورت رد شدن وعده استفاده شده است. اکنون میتوان تابع writeToFile
را به صورت زیر فراخوانی کرد.
writeToFile('test.txt', 'سلام. به مجله تم آف خوش آمدید');
اکنون با باز کردن ترمینال و اجرای دستور زیر، عملیات انجام خواهد شد.
node createFile.js
حال فایلی به نام test.txt
با دستور فوق به صورت زیر تولید شده که حاوی جمله یا متن مد نظر ما است.
استفاده از متد appendFile برای ایجاد و نوشتن در فایل
همانطور که از نام آن معلوم است، استفاده اصلی از این متد برای افزودن یا ویراش فایل مدنظر خواهد بود ولی با این حال میتوان از آن برای ایجاد فایل هم استفاده کرد.
برای مثال در تابع زیر از متد appendFile
برای نوشتن در فایلی با پرچم w
به معنای «نوشتن» (Write) استفاده شده است.
const { appendFile} = require('fs/promises');
async function appendToFile(fileName, data) {
try {
await appendFile(fileName, data, { flag: 'w' });
console.log(`Appended data to ${fileName}`);
} catch (error) {
console.error(`Got an error trying to append the file: {error.message}`);
}
}
اکنون میتوان تابع فوق را به صورت زیر فراخوانی کرد:
appendToFile('test1.txt', 'آموزش ماژول سیستم مدیریت فایل در نود جی اس - مجله تم آف');
حال این بار با اجرای دستور node createFile.js
فایلی جدید به نام text1.js
ایجاد خواهد شد که حاوی محتوای زیر است:
استفاده از متد open برای ایجاد و نوشتن در فایل
آخرین متدی که برای ایجاد و نوشتن روی فایل در ماژول اف اس در Node.js بررسی خواهد شد، متد open
است.
میتوان فایل را با استفاده از پرچم w
(برای نوشتن) باز کرد که مثال زیر این موضوع را بیان میکند.
const { open} = require('fs/promises');
async function openFile(fileName, data) {
try {
const file = await open(fileName, 'w');
await file.write(data);
console.log(`Opened file ${fileName}`);
} catch (error) {
console.error(`Got an error trying to open the file: {error.message}`);
}
}
حال میتوان تابع را به صورت زیر فراخوانی کرد:
openFile('test2.txt', 'آموزش نود جی اس رایگان - مجله تم آف');
اکنون با جرای دستور node createFile.js
در ترمینال خروجی به صورت زیر در فایل جدیدی به نام test2.txt
تولید خواهد شد.
نحوه خواندن فایل با ماژول FS در Node.js
تا به اینجا، آموزش ایجاد و همچنین نوشتن در فایل با ماژول FS در نود جی اس آموزش داده شد و حال نوبت به آموزش خواندن فایل با آن است. این کار با استفاده از متد readFile
در سیستم مدیریت فایل نود جی اس امکانپذیر است.
در ادامه مثالی برای این هدف بیان خواهد شد. برای این منظور ابتدا باید فایلی با نام فرضی readThisFile.js
ساخته و قطعه کد زیر در آن قرار داده شود.
// readThisFile.js
const { readFile } = require('fs/promises');
async function readThisFile(filePath) {
try {
const data = await readFile(filePath);
console.log(data.toString());
} catch (error) {
console.error(`Got an error trying to read the file: {error.message}`);
}
}
حالا هر سه فایلی خوانده خواهند شد که قبلاً با فراخوانی تابع readThisFile
ایجاد شده بودند. قطعه کد فراخوانی تابع به صورت زیر است.
readThisFile('test.txt');
readThisFile('test1.txt');
readThisFile('test2.txt');
اکنون با اجرای دستور node readThisFile.js
، خروجی به صورت تصویر زیر نمایان خواهد شد.
توجه به این نکته ضروری است که متد readFile
فایل را به صورت ناهمزمان میخواند. در نتیجه، ترتیب خواندن فایل و ترتیب دریافت پاسخ برای چاپ در کنسول ممکن است یکسان نباشد. برای اطمینان از ترتیب مورد نظر، باید از نسخه همزمان متد readFile
استفاده کرد.
تغییر نام فایل با ماژول اف اس در نود جی اس چگونه انجام می شود؟
بحث مهم دیگر در این آموزشِ ماژول FS در Node.js، بحث تغییر نام فایل است. برای تغییر نام فایل، از متُدی به نام rename
به منظور تغییر نام در ماژول FS استفاده خواهد شد.
برای مثال اگر فایلی با نام فرضی Faradars.tex
وجود داشته باشد و بخواهیم نام آن را تغییر دهیم، باید به صورت زیر عمل کرد.
const { rename } = require('fs/promises');
async function renameFile(from, to) {
try {
await rename(from, to);
console.log(`Renamed ${from} to ${to}`);
} catch (error) {
console.error(`Got an error trying to rename the file: ${error.message}`);
}
}
قطعه کد بالا در فایلی با نام فرضی renameFile.js
ذخیره شده است. طبق قطعه کد بالا، متد rename
دو آرگومان میگیرد. یکی فایل با نام منبع و دیگری فایل با نام فایل مقصد است. حال تابع بالا برای تغییر نام فایل به صورت زیر فراخوانی خواهد شد.
const oldName = "Faradars.txt";
const newName = "blog.Faradars.txt";
renameFile(oldName, newName);
اکنون با اجرای دستور node renameFile.js
در ترمینال خروجی به صورت زیر خواهد بود و فایل از Faradars.txt
به blog.Faradars.txt
تغییر نام پیدا خواهد کرد.
انتقال فایل با ماژول FS در Node JS
برای انتقال فایل از یک دایرکتوری به دایرکتوری دیگر، میتوان از متُد rename
استفاده کرد که در این جا اساساً فقط مسیر فایل را تغییر نام میدهد. در این حالت، انتقال فایل با تغییر نام مسیر آن به مقصد مورد نظر حاصل میشود.
برای نشان دادن این موضوع، باید مراحل زیر را دنبال کرد:
- دو پوشه به نامهای « from
» و « to
» در مسیر مورد نظر برای مثال باید ایجاد شوند.
- در داخل پوشه « from
»، باید فایلی به نام « move-me.txt
» ساخت.
- همچنین فایلی به نام moveFile.js
ایجاد و قطعه کد زیر را به آن باید اضافه کرد.
const { rename } = require('fs/promises');
const { join } = require('path');
async function moveFile(from, to) {
try {
await rename(from, to);
console.log(`Moved ${from} to ${to}`);
} catch (error) {
console.error(`Got an error trying to move the file: ${error.message}`);
}
}
در قطعه کد ارائه شده بالا، متد join
از ماژول path
ایمپورت شده است، زیرا این کار به کاربر امکان میدهد تا مسیرهای فایل معتبری را با پیوستن چندین بخش مسیر به یکدیگر بسازد. ماژول path
نوعی ماژول داخلی در Node.js است که ابزارهایی را برای کار با مسیرهای فایل و دایرکتوری ارائه میدهد.
با استفاده از متد join
، میتوان مطمئن شد که مسیرهای فایلهای مبدأ و مقصد بدون در نظر گرفتن سیستمعامل زیربنایی به درستی شکل گرفتهاند. سیستمعاملهای مختلف از قراردادهای متفاوتی برای نمایش مسیرهای فایل استفاده میکنند، مانند استفاده از «اسلشهای رو به جلو» (/) یا «اسلشهای رو به عقب» () به عنوان جداکننده و متد join
از این تفاوتها مراقبت میکند و مسیری معتبر تولید خواهد کرد که به طور مداوم در بین پلتفرمهای مختلف کار میکند.
const fromPath = join(__dirname, "from", "move-me.txt");
const destPath = join(__dirname, "to", "move-me.txt");
moveFile(fromPath, destPath);
حال اگر اسکریپت moveFile.js
با دستور Nod moveFile.js
اجرا شود، فایل move-me.txt
از دایرکتوری From
به دایرکتوری to
منتقل خواهد شد.
کپی کردن فایل با ماژول FS در نود جی اس
این بخش از آموزش ماژول FS در Node.js مختص نحوه کپی کردن فایل است. برای این هدف از متد copyFile
از ماژول FS برای کپی کردن فایل از مبدا به مقصد استفاده خواهد شد.
قطعه کد زیر به منظور آموزش این عملیات ارائه شده است.
const { copyFile } = require('fs/promises');
const { join } = require('path');
async function copyAFile(from, to) {
try {
await copyFile(from, to);
console.log(`Copied ${from} to ${to}`);
} catch (err) {
console.error(`Got an error trying to copy the file: ${err.message}`);
}
}
حال میتوان عمل کپی را به صورت زیر انجام داد:
copyAFile('test.txt', 'test-copy.txt');
با اجرای دستور node copyFile.js
کد بالا محتوای test.txt
را در فایل test-copy.txt
کپی میکند. این یعنی فایل جدیدی به نام test-copy.txt
ایجاد خواهد شد که حاوی محتوای test.txt
است.
روش گفته شده فقط برای انجام عملیات کپی روی یک فایل است. حال در ادامه، اجرای این عمل برای چندین فایل به صورت همزمان آموزش داده خواهد شد. برای این هدف میتوان از Promise.all API
برای اجرای همزمان چندین وعده به صورت زیر استفاده کرد.
async function copyAll(fromDir, toDir, filePaths) {
return Promise.all(filePaths.map(filePath => {
return copyAFile(join(fromDir, filePath), join(toDir, filePath));
}));
}
حال میتوان ارائه تمام مسیرهای فایل را برای کپی کردن از یک دایرکتوری به دایرکتوری دیگر به صورت زیر انجام داد.
copyFiles('from', 'to', ['copyA.txt', 'copyB.txt']);
همچنین میتوان از این روش برای انجام عملیات دیگری مانند انتقال، نوشتن و خواندن فایلها به صورت همزمان استفاده کرد.
نصب سرویس Node.js روی وب سرور | راهنمای جامع
حذف فایل با ماژول FS در Node.js
برای حذف فایل با استفاده از ماژول FS در Node.js میتوان از متد unlink
به صورت زیر استفاده کرد:
const { unlink } = require('fs/promises');
async function deleteFile(filePath) {
try {
await unlink(filePath);
console.log(`Deleted ${filePath}`);
} catch (error) {
console.error(`Got an error trying to delete the file: ${error.message}`);
}
}
اکنون با افزودن قطعه کد زیر به کدهای بالا و با اجرای دستور مربوطه در ترمینال فایل مد نظر از دایرکتوری حذف خواهد شد.
deleteFile('delete-me.txt');
نحوه تغییر مجوزها و مالکیت فایل با ماژول FS
اگر نیاز به تغییر مجوزهای فایل وجود داشته باشد، میتوان از متد chmod
از ماژول FS/promises
در Node.js استفاده کرد. این متد به کاربر اجازه میدهد تا مجوزهای فایل را تغییر دهد.
در زیر نمونه کدی آورده شده است که نحوه تغییر مجوزهای فایل را با استفاده از متد chmod
نشان میدهد.
const { chmod } = require('fs/promises');
async function changePermission(filePath, permission) {
try {
await chmod(filePath, permission);
console.log(`Changed permission to ${permission} for ${filePath}`);
} catch (error) {
console.error(`Got an error trying to change permission: ${error.message}`);
}
}
برای این هدف، باید مطمئن شد که مجوزهای لازم برای اصلاح فایل را داشته و مسیر فایل صحیح است. مقدار مجوز باید با استفاده از نماد بیتی که نشان دهنده مجوزهای فایل مورد نظر است، مشخص شود.
changePermission('permission.txt', 0o400);
خروجی قطعه کد بالا با اجرای node chmod.js
به صورت زیر خواهد بود:
مشابه مجوز فایل، همچنین میتوان مالکیت فایل را با ماژول FS در نود جی اس تغییر داد. برای این هدف از متدی به نام chown
به صورت زیر استفاده خواهد شد.
const { chown } = require('fs/promises');
async function changeOwnership(filePath, userId, groupId) {
try {
await chown(filePath, userId, groupId);
console.log(`Changed ownership to ${userId}:${groupId} for ${filePath}`);
} catch (error) {
console.error(`Got an error trying to change ownership: ${error.message}`);
}
}
سپس تابع باید با مسیر فایل، شناسه کاربری و شناسه گروه به صورت زیر فراخوانی شود.
changeOwnership('ownership.txt', 1000, 1010);
حال با اجرای دستور node chown.js
در ترمینال مالکیت فایل تغییر خواهد کرد.
نحوه ایجاد پیوند با ماژول FS در Node.js
برای ایجاد «پیوندی نمادین» (Symlink) با استفاده از ماژول سیستم فایل Node.js، میتوان از متد symlink
استفاده کرد. این متد به کاربران امکان میدهد پیوندی به فایل یا پوشه مورد نظر ایجاد کنند.
در اینجا قطعه کد نحوه ایجاد پیوند نمادین با استفاده از متد symlink
آورده شده است.
const { symlink } = require('fs/promises');
const { join } = require('path');
async function createSymlink(target, path, type) {
try {
await symlink(target, path, type);
console.log(`Created symlink to ${target} at ${path}`);
} catch (error) {
console.error(`Got an error trying to create the symlink: ${error.message}`);
}
}
در قطعه کد بالا، تابع createSymlink
تعریف شده است که سه پارامتر target
، path
و type
را میگیرد.
- پارامتر target
نشان دهنده مسیر فایل یا پوشه مورد نظر است که کاربر میخواهد پیوندی نمادین برای آن ایجاد کند.
- path
نشان دهنده مسیری است که کاربر میخواهد پیوند را در آن ایجاد کند.
- پارامتر type
نوع رابط پیوندی را مشخص خواهد کرد که باید ایجاد شود. نوع آن میتواند «file» یا «dir» باشد.
در داخل تابع، متد symlink
به صورت ناهمزمان با استفاده از await
برای ایجاد پیوند بر اساس پارامترهای ارائه شده فراخوانی میشود. در صورت موفقیت آمیز بودن عملیات، پیام موفقیت آمیز در کنسول چاپ و اگر خطایی رخ دهد، پیام خطا ثبت میشود.
حال با استفاده از تابع زیر پیوند فرضی ایجاد خواهد شد.
createSymlink('join(__dirname, from, symMe.txt)', 'symToFile', 'file');
حال با اجرای دستور مربوطه در ترمینال، پیوند نمادین یا فرضی ایجاد خواهد شد.
نحوه مشاهده تغییرات فایل با ماژول FS در نود جی اس
برای مشاهده تغییرات روی فایل در Node.js، میتوان از متد watch
ارائه شده به وسیله ماژول سیستمِ فایلِ نود جی اس استفاده کرد. این متد به کاربران امکان میدهد تغییرات و رویدادها را نظارت کنند و راهی را به منظور ضبط و ممیزی آنها برای بررسی بعدی فراهم میکند. اگرچه متدی جایگزین به نام watchFile
برای این کار نیز وجود دارد، اما به اندازه متد watch
کارآمد نیست.
تا کنون در این آموزش ماژول اف اس در Node.js از کلمات کلیدی async/wait
استفاده شده است، حال در این جا استفاده از تابع callback
با مثالی در ادامه بررسی خواهد شد. با استفاده از متد watch
، میتوان مسیر فایل و تابع callback
را به عنوان آرگومان ارسال کرد. هر زمان که فعالیتی در فایل رخ میدهد، تابع callback
به طور خودکار فراخوانی میشود. قطعه کد آنچه که گفته شد به صورت زیر است.
const fs = require('fs');
function watchAFile(file) {
fs.watch(file, (event, filename) => {
console.log(`${filename} file Changed`);
});
}
پارامتر رویداد ارائه شده به تابع callback
به کاربر امکان میدهد اطلاعات بیشتری در مورد فعالیتهای خاصی که انجام شده است جمعآوری کند. میتوان از آن برای تشخیص تغییر، تغییر نام یا حتی پیگیری حذف فایل نیز استفاده کرد.
در کدهای بالا و در داخل تابع، متد FS.watch
فراخوانی میشود که پارامتر فایل و یک تابع callback
را به عنوان آرگومان ارسال میکند. وقتی هر فعالیتی مانند تغییر، تغییر نام یا حذف روی فایل رخ میدهد، تابع پاسخ به callback
ارائه شده فعال میشود. تابع callback
دو پارامتر را دریافت میکند: رویداد و نام فایل. پارامتر رویداد به کاربر در مورد نوع فعالیتی که رخ داده است اطلاع میدهد، در حالی که پارامتر filename
نام فایل مرتبط با رویداد را ارائه خواهد داد.
با استفاده از این رویکرد، هر زمان که یک رویداد تغییر در فایل مشاهده شده شناسایی شود، تابع callback
فراخوانی میشود و پیامی را نشان میدهد مبنی بر اینکه که کدام فایل تغییر کرده است. حال با ارسال نام فایل مد نظر به عنوان آرگومان، عملیات بازبینی تغییرات انجام خواهد شد.
watchAFile('test.txt');
حال با اجرای دستور node watc.js
قطعه کد بالا اجرا خواهد شد و تغییرات صورت گرفته برای فایل test
به صورت زیر قابل مشاهده خواهد بود.
کار با پوشه ها در ماژول FS نود جی اس
کار با «دایرکتوریها» (پوشهها) در Node.js راهی عالی برای مدیریت دادهها و فایلها است. با متدها و عملیات مناسب، میتوان به راحتی پوشهها را تغییر نام داد و یا آنها را منتقل و کپی کرد. علاوه بر این، عملیات منحصربهفردی به طور خاص برای دایرکتوریها وجود دارد که در این بخش از آموزش ماژول FS در Node.js به آن خواهیم پرداخت.
ساخت پوشه جدید با ماژول FS در نود جی اس
برای ساخت دایرکتوری جدید در ماژول FS از متد mkdir
استفاده میشود. برای این هدف باید نام دایرکتوری مد نظر را به عنوان آرگومان ارسال کرد. قطعه کد انجام این کار به صورت زیر است.
const { mkdir } = require('fs/promises');
async function createDirectory(path) {
try {
await mkdir(path);
console.log(`Created directory ${path}`);
} catch (error) {
console.error(`Got an error trying to create the directory: ${error.message}`);
}
}
اکنون میتوان تابع createDirectory
را با مسیر دایرکتوری به صورت زیر فراخوانی کرد.
createDirectory('Test-directory');
حال با اجرای دستور node Createdirectory.js
، پوشه جدید به صورت زیر ساخته خواهد شد.
ایجاد دایرکتوری موقت با ماژول اف اس در Node.js
ایجاد دایرکتوری موقت با ماژول FS در نود جی اس نیز بسیار آسان است. برای این کار میتوان از متد mkdtemp()
استفاده کرد. برای این هدف باید محل دایرکتوری سیستم عامل را با استفاده از متد tmpdir()
از ماژول os
استفاده کرد.
هنگامی که مسیر دایرکتوری موقت یافت شد، از متد mkdtemp()
برای ایجاد پوشه موقت جدید میتوان استفاده کرد. با این کار میتوان به راحتی دایرکتوری موقت با ماژول FS ایجاد کرد.
const { mkdtemp } = require('fs/promises');
const { join } = require('path');
const { tmpdir } = require('os');
async function createTemporaryDirectory(fileName) {
try {
const tempDirectory = await mkdtemp(join(tmpdir(), fileName));
console.log(`Created temporary directory ${tempDirectory}`);
} catch (error) {
console.error(`Got an error trying to create the temporary directory: ${error.message}`);
}
}
حال با فراخوانی تابع زیر و اجرای دستور node Temprary-Directory.js
در ترمینال، پوشه موقت به صورت زیر ایجاد خواهد شد.
createTemporaryDirectory('node-temp-file-');
نکته: همانطور که در تصویر بالا قابل مشاهده است، Node.js شش کاراکتر تصادفی را در انتهای نام پوشه موقت ایجاد شده اضافه میکند تا آن را منحصربهفرد نگه دارد.
حذف دایرکتوری با ماژول سیستم فایل در نود جی اس
حذف دایرکتوری با ماژول FS با استفاده از متد rmdir()
امکانپذیر است و قطعه کد انجام این کار در ادامه آمده است.
const { rmdir } = require('fs/promises');
async function deleteDirectory(path) {
try {
await rmdir(path);
console.log(`Deleted directory ${path}`);
} catch (error) {
console.error(`Got an error trying to delete the directory: ${error.message}`);
}
}
با فراخوانی تابع زیر و ارسال نام پوشه به عنوان آرگومان، امکان حذف پوشه با ماژول FS در نود جی اس فراهم خواهد شد.
deleteDirectory('new-directory-renamed');
حال با اجرای دستور مربوطه، پوشه یا دایرکتوری مد نظر حذف خواهد شد.
API های هم زمان و ناهمزمان
APIهای همزمان و ناهمزمان دو نوع متد متفاوتی هستند که به وسیله آنها برنامه میتواند به دادهها دسترسی داشته باشد.
APIهای ناهمزمان را میتوان زمانی استفاده کرد که نیاز به پردازش موازی عملیات داشته باشیم و برای ادامه عملیات بعدی نیازی به خروجی عملیاتی دیگر ندارد. به عنوان مثال، هنگام کار با ماژول FS در محیط زمان اجرای Node.js، میتوان از متدهای async
مانند readFile()
برای پردازش همزمان چندین فایل استفاده کرد.
از سوی دیگر، APIهای همزمان وقتی استفاده میشوند که مانند هنگام خواندن چندین فایل، کاربر نیاز داشته باشد عملیات را یکی پس از دیگری پردازش کند. در این حالت میتوان از متد readFileSync()
ماژول FS به صورت زیر استفاده کرد.
const { readFileSync } = require('fs');
function readFileSynchronously(path) {
try {
const data = readFileSync(path);
console.log(data.toString());
} catch (error) {
console.error(error);
}
}
بسته FS/promises
نیازی به استفاده از متد readFileSync()
ندارد، زیرا این متد ناهمزمان نیست. بنابراین، میتوان به سادگی تابع زیر را بدون نیاز به متد readFileSync()
فراخوانی کرد.
readFileSynchronously('test.txt');
readFileSynchronously('test1.txt');
readFileSynchronously('test2.txt');
حال با اجرای دستور node readFileSync.js
در ترمینال، هر سه فایل test
، test1
و test2
خوانده خواهند شد.
ماژول سیستم فایل Node.js متدهای مختلفی را برای خواندن فایلها ارائه میدهد. هنگام استفاده از توابع read
، فایلها به ترتیبی خوانده خواهند شد که فراخوانی شدهاند. برای سایر عملیات، ماژول سیستم فایل در نود جی اس نوعی متد همزمان ارائه میدهد، با این حال توصیه میشود از متدهای ناهمزمان برای اجرای موازی استفاده شود. این کار به اطمینان از اجرای روان همه کارها و به حداکثر رساندن کارایی کمک میکند.
آموزش Node.js: برنامه نویسی ناهمگام و Callback — بخش هفتم
رسیدگی به خطاها در ماژول FS
هنگام کار با فایلها یا دایرکتوریها، بروز خطاها اجتنابناپذیر هستند و آمادگی برای رسیدگی به آنها در هنگام بروز این خطاها کاری ضروری محسوب میشود. برای مثال اگر نتوان فایل را پیدا کرد یا اجازه نوشتن در آن وجود نداشته باشد، احتمالاً خطایی رخ داده است.
برای جلوگیری یا کاهش خطا، استفاده از بلوک try-catch
هنگام فراخوانی متدها مهم است. در صورت بروز خطا، کنترل به بلوک try-catch
منتقل میشود و به برنامه نویس امکان میدهد مشکل را برطرف کند.
سخن پایانی
ماژول سیستم فایل در Node.js ابزاری مفید برای مدیریت وظایف سطح پایین و عملیات فایل است. با ماژول FS میتوان عملیات مختلفی را روی فایلها و دایرکتوریها انجام داد. عملیاتی مانند ایجاد، تغییر نام، حذف، کپی و غیره از مهمترین این عملیات هستند که در این مطلب از مجله تم آف به صورت عملی بیان شدند.
همه متدها را میتوان به صورت ناهمزمان با استفاده از Promise در جاوا اسکریپت یا توابع Callback یا در صورت نیاز به صورت همزمان فراخوانی کرد. با این حال بسیار مهم است که هر بار که با متدها کار میشود، خطاها را با بلوک try-catch
کنترل کنیم. همچنین متدهای ناهمزمان باید همیشه بر متدهای همزمان ترجیح داده شوند.