از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
نوشتن روی فایلها در Node.js نوشتن روی فایلها یک نیاز مکرر هنگام برنامهنویسی به هر زبانی است. مانند سایر زبان های برنامه نویسی، جاوا اسکریپت با Node.js با استفاده از یک ماژول که با سیستم فایل سیستم عامل سروکار دارد، برخورد با سیستم فایل را بصری می کند. ماژول fs شامل قابلیت دستکاری فایل ها و…
سرفصلهای مطلب
معرفی
هنگام برنامه نویسی به هر زبانی، نوشتن روی فایل ها یک نیاز مکرر است. مانند سایر زبان های برنامه نویسی، جاوا اسکریپت با Node.js با استفاده از یک ماژول که با سیستم فایل سیستم عامل سروکار دارد، برخورد با سیستم فایل را بصری می کند.
را fs ماژول شامل قابلیت دستکاری فایل ها و برخورد با سیستم فایل پلت فرم محاسباتی است. همراه با خواندن از فایلها و نوشتن روی آنها، میتوانید از این ماژول برای جستجوی آمار فایلها مانند اندازه و تعداد فایلها استفاده کنید.
به طور پیش فرض، fs
ماژول فایل هایی را با رمزگذاری “utf8” می نویسد. UTF-8 رمزگذاری است که معمولاً در صفحات وب و سایر اسناد استفاده می شود. رمزگذاری فایل به مجموعه کاراکتری که برای محتویات فایل استفاده می شود اشاره دارد. رمزگذاری های رایج مورد استفاده عبارتند از ‘utf8’، ‘ascii’، ‘binary’، ‘hex’، ‘base64’ و ‘utf16le’.
هر کدگذاری کاراکتر دارای مزایا و موارد خاصی است که در آن بیشترین معنا را دارد. به عنوان مثال، ‘ascii’ یک رمزگذاری آسان برای خواندن و نوشتن است، اما بیت بالا را از جریان داده حذف می کند. به دلایلی مانند این، باید رمزگذاری کاراکتر خود را با دقت انتخاب کنید.
در چند بخش بعدی راه های مختلف را ارائه خواهیم کرد fs
به شما اجازه می دهد تا در سیستم فایل بنویسید، از جمله تفاوت ها و مزایای آنها.
روش 1: استفاده از fs.writeFile
را fs
ماژول شامل یک سطح بالا است writeFile
روشی که می تواند داده ها را به صورت ناهمزمان بر روی فایل ها بنویسد. این بدان معناست که مانند بسیاری از عملیاتها در Node.js، I/O غیر مسدود است و پس از پایان عملیات، یک رویداد منتشر میکند. ما می توانیم یک تابع تماس بنویسیم تا زمانی که writeFile
برمی گرداند.
در اینجا یک نمونه کد ساده از نوشتن متن آهنگ در یک فایل وجود دارد:
// writefile.js
const fs = require('fs');
let lyrics = 'But still I\'m having memories of high speeds when the cops crashed\n' +
'As I laugh, pushin the gas while my Glocks blast\n' +
'We was young and we was dumb but we had heart';
// write to a new file named 2pac.txt
fs.writeFile('2pac.txt', lyrics, (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('Lyric saved!');
});
ما نام فایل را به همراه کاراکترهایی که باید بنویسند و همچنین یک تابع callback برای اجرا در هنگام بازگشت متد مشخص کردیم. ما همچنین میتوانیم یک شی یا رشته گزینهای را ارسال کنیم که کدگذاری مورد استفاده، و همچنین حالت و پرچم را مشخص میکند. اگر باید رمزگذاری کاراکتر را مشخص کنید، روشی که باید متد را فراخوانی کنید در اینجا آمده است:
fs.writeFile('2pac.txt', 'Some other lyric', 'ascii', callback);
توجه داشته باشید که اگر فایل هنوز وجود نداشته باشد، فراخوانی این روش در واقع انجام خواهد شد فایل را ایجاد کنید همچنین، بنابراین شما نیازی به نگرانی در مورد آن ندارید روی پایان شما
یک روش همزمان وجود دارد fs.writeFileSync
که می توانید به جای آن استفاده کنید fs.writeFile
.
تفاوت این است که fs.writeFileSync
متد عملیات ورودی/خروجی را به صورت همزمان انجام می دهد و حلقه رویداد Node.js را در حین نوشتن فایل مسدود می کند. اگر در این نوشتن های همزمان زیاده روی کنید، ممکن است در عملکرد برنامه Node.js شما اختلال ایجاد کند. در بیشتر موارد، شما باید از نوشتن ناهمزمان استفاده کنید.
فقط بدانید که هنگام استفاده از این دو روش باید مراقب باشید زیرا هر بار یک فایل جدید ایجاد می کنند یا اگر محتویات از قبل وجود داشته باشد، آنها را جایگزین خواهند کرد. اگر فقط می خواهید یک فایل موجود را به روز کنید، باید از آن استفاده کنید appendFile
، که در ادامه این مقاله به آن می پردازیم.
روش 2: استفاده از fs.write
بر خلاف سطح بالا fs.writeFile
و fs.writeFileSync
با استفاده از این روشها، میتوانید هنگام نوشتن روی فایلها در Node.js با استفاده از سطح پایین، کنترل بیشتری را اعمال کنید fs.write
روش. را fs.write
روش اجازه می دهد تا کنترل دقیقی بر موقعیت فایل برای شروع نوشتن در بافری که می توانید تعیین کنید تا بنویسید و همچنین قسمتی از بافر که می خواهید روی فایل بنویسید را کنترل کنید.
علاوه بر این، استفاده از قابلیت نوشتن سطح پایین به شما امکان میدهد دقیقاً بدانید که توصیفکنندههای فایل چه زمانی منتشر میشوند و مطابق با آن پاسخ دهید، مانند ارسال اعلانهای فشار در برنامهتان.
در اینجا یک مثال است که در آن چند خط دیگر از اشعار را با استفاده از یک فایل دیگر می نویسیم fs.write
.
// fs_write.js
const fs = require('fs');
// specify the path to the file, and create a buffer with characters we want to write
let path = 'ghetto_gospel.txt';
let buffer = new Buffer('Those who wish to follow me\nI welcome with my hands\nAnd the red sun sinks at last');
// open the file in writing mode, adding a callback function where we do the actual writing
fs.open(path, 'w', function(err, fd) {
if (err) {
throw 'could not open file: ' + err;
}
// write the contents of the buffer, from position 0 to the end, to the file descriptor returned in opening our file
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('wrote the file successfully');
});
});
});
شما می خواهید استفاده کنید fs.write
برای مثال، هنگام انجام بهروزرسانیهای دقیق فایلها، نوشتن دنبالهای از بایتها در یک موقعیت مشخص در وسط یک فایل.
این روش ها با توصیف کننده های فایل کار می کنند و شما باید فایل را برای نوشتن با آن باز کنید fs.open
و سپس در پایان دوباره آن را با fs.close
به منظور جلوگیری از نشت حافظه
روش 3: استفاده از fs.createWriteStream
هنگام مدیریت فایلهای مخصوصاً بزرگ، یا فایلهایی که به صورت تکهای، مثلاً از اتصال شبکه، استفاده میشوند جریان ها برای نوشتن فایل ها به صورت یکجا از طریق روش های فوق که کل فایل ها را می نویسند، ترجیح داده می شود.
استریم ها مقدار کمی داده را در یک زمان می نویسند. در حالی که این مشکل این است که کندتر است زیرا داده ها به صورت تکه ای منتقل می شوند، اما مزایایی برای عملکرد RAM دارد. از آنجایی که کل فایل به یکباره در حافظه بارگذاری نمی شود، مصرف RAM کمتر است.
برای نوشتن روی یک فایل با استفاده از جریان، باید یک جریان قابل نوشتن جدید ایجاد کنید. سپس میتوانید دادهها را در فواصل زمانی، به یکباره، یا با توجه به در دسترس بودن دادهها از یک سرور یا موارد دیگر در جریان بنویسید. process، سپس جریان را برای همیشه ببندید، زمانی که تمام بسته های داده نوشته شدند.
در اینجا یک نمونه کد از روش انجام این کار آورده شده است:
// write_stream.js
const fs = require('fs');
let writeStream = fs.createWriteStream('secret.txt');
// write some data with a base64 encoding
writeStream.write('aef35ghhjdk74hja83ksnfjk888sfsf', 'base64');
// the finish event is emitted when all data has been flushed from the stream
writeStream.روی('finish', () => {
console.log('wrote all data to file');
});
// close the stream
writeStream.end();
ما یک جریان قابل نوشتن ایجاد کردیم، سپس برخی از داده ها را در جریان نوشتیم. زمانی که رویداد “پایان” منتشر میشود، یک بیانیه گزارش اضافه کردهایم که به ما اطلاع میدهد که همه دادهها به سیستم زیربنایی منتقل شدهاند. در این مورد، به این معنی است که تمام داده ها در سیستم فایل نوشته شده است.
با توجه به مزایای عملکرد، استریم ها تکنیکی هستند که می بینید به طور گسترده در قلمرو Node.js استفاده می شود، نه فقط برای نوشتن فایل. مثال دیگر استفاده از جریان برای دریافت داده از اتصال شبکه است.
مدیریت خطا هنگام نوشتن روی یک فایل
هنگام نوشتن بر روی فایل ها، خطاهای مختلفی در هنگام ورودی/خروجی ممکن است رخ دهد. کد شما باید این خطاهای احتمالی را برطرف کند. یک کار ساده این است که خطاها را به عنوان استثناء Node.js قرار دهید. این برنامه را از کار می اندازد، و بنابراین توصیه نمی شود مگر در مواردی که شما کمتر به آن مراجعه کنید.
به عنوان مثال، اگر خطا فقط می تواند به عنوان یک اشتباه برنامه نویس رخ دهد که به عنوان یک باگ نیز شناخته می شود، خراب کردن برنامه ممکن است بهترین پاسخ باشد زیرا فوراً خطا را به برنامه نویس هشدار می دهد و خطا را پنهان نمی کند.
هنگامی که شما با خطاهای عملیاتی سر و کار دارید، مانند مشخص کردن مسیری که غیرقابل دسترسی است، در این صورت دو رویکرد وجود دارد. یکی فراخوانی یک تابع تماس با خطا است. در پاسخ به تماس، سپس برخی از منطق رسیدگی به خطا را شامل میشوید، مانند ثبت آن.
از طرف دیگر، میتوانید بلوکهای try/catch را در اطراف کدی که بخشی از برنامه را فراخوانی میکند قرار دهید که در آن خطا ممکن است رخ دهد.
با fs.appendFile به یک فایل اضافه می شود
در مواردی که فقط می خواهیم به محتویات یک فایل اضافه کنیم، می توانیم از آن استفاده کنیم fs.appendFile
روش سطح بالا و همتای همزمان آن، fs.appendFileSync
. با استفاده از fs.appendFile
اگر فایل وجود نداشته باشد، آن را ایجاد می کند و در غیر این صورت به فایل اضافه می کند.
در اینجا یک مثال از استفاده است fs.appendFile
برای نوشتن در یک فایل
// append_file.js
const fs = require('fs');
// add a line to a lyric file, using appendFile
fs.appendFile('empirestate.txt', '\nRight there up روی Broadway', (err) => {
if (err) throw err;
console.log('The lyrics were updated!');
});
در اینجا، ما استفاده می کنیم appendFile
برای افزودن یک خط اضافی به فایل حاوی اشعار زیر:
// empirestate.txt
Empire State of Mind - JAY-Z
I used to cop in Harlem;
hola, my Dominicanos
استفاده کردن fs.appendFile
فایل را بازنویسی نمی کند، اما با داده های جدیدی که اضافه می کنیم، آن را از موقعیت پایانی به روز می کند. این یک ویژگی مفید زمانی است که شما فقط می خواهید یک فایل را به روز کنید، مانند افزودن مداوم داده ها به یک فایل گزارش.
بنابراین پس از اجرای کد ما، فایل متنی به شکل زیر خواهد بود:
// empirestate.txt
Empire State of Mind - JAY-Z
I used to cop in Harlem;
hola, my Dominicanos
Right there up روی Broadway
همانطور که می بینید، متن قدیمی هنوز وجود دارد و رشته جدید ما به انتها اضافه شده است.
بیشتر بدانید
آیا می خواهید در مورد اصول Node.js بیشتر بدانید؟ من شخصاً توصیه می کنم یک دوره آنلاین مانند Node.js را توسط Wes Bos بیاموزید. نه تنها بهروزترین نحو ES2017 را یاد خواهید گرفت، بلکه میتوانید یک برنامه رستوران کامل بسازید. در تجربه من، ساختن اپلیکیشن های دنیای واقعی مانند این سریع ترین راه برای یادگیری است.
نتیجه
همانطور که دیدیم، چندین رویکرد وجود دارد که باید هنگام نوشتن روی یک فایل در Node.js در نظر گرفت. ساده ترین راه، و اغلب مناسب ترین، استفاده از آن است writeFile
روش در fs
مدول. این به شما اجازه میدهد تا در مسیر فایل مشخص شده، با رفتار ناهمزمان بنویسید، و یک فایل جدید ایجاد کنید یا اگر در مسیر وجود داشت، آن را جایگزین کنید.
اگر فایلهای بزرگتری مینویسید، باید قابلیتهای نوشتن تکهشده جریانهای قابل نوشتن را در نظر بگیرید. اینها به جای بارگیری یکباره داده ها در حافظه، بافرهای داده را به صورت تکه ای بنویسند. استفاده از استریم ها به شما در دستیابی به عملکرد بهتر در چنین مواردی کمک می کند.
برای موقعیت های خاص، می توانید از سطح پایین تر استفاده کنید fs
آب و برق مانند fs.write
. را fs
ماژول از عملیات نوشتن فایل ریز برای مطابقت با نیازهای خاص شما پشتیبانی می کند.
(برچسبها برای ترجمه)# روش
منتشر شده در 1403-01-28 00:44:03