Menu

fs.writeFile ב-Node.js: כתיבה, הוספה ויצירת קבצים

כותבים קובץ ב-Node.js עם fs.writeFile, עם fs.writeFileSync או עם await writeFile מתוך fs/promises. הקובץ נוצר אם הוא חסר ומוחלף אם הוא קיים; השתמשו ב-appendFile כדי להוסיף לסופו.

בדף הזה יש עורכים שאפשר להריץ. לערוך, להריץ ולראות את הפלט מיד.

fs.writeFile(path, data, callback) כותב מחרוזת או Buffer לקובץ. אם הקובץ לא קיים, Node יוצר אותו; אם הוא קיים, התוכן הישן מוחלף. fs.writeFileSync(path, data) עושה את אותו הדבר ומחכה עד שהכתיבה מסתיימת, ו-fs.appendFile מוסיף לסוף הקובץ במקום להחליף אותו.

הוא מדפיס saved ואז את הטקסט שקרא בחזרה; ה-callback מקבל רק שגיאה (או null), אף פעם לא את הנתונים. העבירו 42 במקום המחרוזת והקריאה תזרוק TypeError: הנתונים חייבים להיות מחרוזת או Buffer.

writeFile, ‏writeFileSync ו-fs/promises

שלוש הצורות מקבלות את אותם ארגומנטים, וההבדל הוא איך מחכים לתוצאה.

const fs = require('fs');
const fsp = require('fs/promises');

fs.writeFileSync('a.txt', 'one');            // blocks, throws on error

fs.writeFile('b.txt', 'two', (err) => {});   // callback with err

await fsp.writeFile('c.txt', 'three');       // promise, use in async code

השתמשו ב-writeFileSync בסקריפטים ובקוד עלייה, ובגרסת ה-promise בשרתים, שבהם כתיבה סינכרונית חוסמת כל בקשה אחרת עד שהדיסק מסיים. הדף על fs/promises מראה את שאר ה-API של ה-promises.

הוספה לקובץ עם appendFile

writeFile מחליף את כל הקובץ. כדי להוסיף שורה ללוג, השתמשו ב-appendFile, שגם יוצר את הקובץ בפעם הראשונה.

הקריאה הראשונה מדפיסה "second\n", כי ה-writeFileSync השני החליף את first, והשנייה מדפיסה "second\nthird\nfourth\n" (‏JSON.stringify הופך את תווי השורה החדשה לגלויים). הוסיפו את ה-\n בעצמכם: אף אחת מהפונקציות לא מוסיפה אותו.

writeFileappendFile
הקובץ חסריוצר אותויוצר אותו
הקובץ קייםמחליף את התוכןמוסיף לסוף
דגל ברירת מחדל'w''a'
שימוש טיפוסישמירת מסמך שלם או JSONלוגים, שורה בכל פעם

לא לדרוס: האפשרות flag

הארגומנט השלישי יכול להיות אובייקט אפשרויות. ה-flag שלו קובע מה קורה לקובץ קיים. 'wx' פירושו "כתוב, אבל היכשל אם הקובץ כבר קיים", וזו הדרך הבטוחה ליצור קובץ פעם אחת בלבד.

הקריאה השנייה נכשלת עם EEXIST, ולכן הקובץ עדיין מכיל abc123. שנו את שם הקובץ בקריאה השנייה ל-id2.txt, ושתי הקריאות ידפיסו created.

הדגלים שתפגשו הכי הרבה: 'w' (ברירת המחדל, החלפה), 'a' (הוספה), 'wx' (יצירה בלבד) ו-'ax' (הוספה, אבל רק לקובץ חדש).

בדיקה עם fs.existsSync ואחריה כתיבה משאירה פער: תהליך אחר יכול ליצור את הקובץ בין הבדיקה לכתיבה. 'wx' עושה את שניהם בצעד אחד.

כתיבת JSON לקובץ

writeFile לא מקבל אובייקטים. הפכו אותם לטקסט עם JSON.stringify; הארגומנט השלישי, 2, מזיח את הפלט כך שהקובץ קריא.

הקובץ מחזיק את האובייקט על פני כמה שורות מוזחות, ופענוח שלו בחזרה נותן אובייקט שווה, ולכן השורה האחרונה מדפיסה 2. העבירו את האובייקט בלי JSON.stringify והקריאה תזרוק TypeError.

יצירת התיקייה קודם עם mkdir

writeFile יוצר קבצים, לא תיקיות. כתיבה ל-reports/2026/june.txt כש-reports לא קיימת נכשלת עם ENOENT. צרו את הנתיב קודם עם mkdir ו-{ recursive: true }, שיוצר כל תיקייה חסרה ולא עושה כלום אם הן כבר קיימות.

הכתיבה הראשונה נכשלת עם ENOENT; אחרי mkdir, אותה כתיבה מצליחה ו-readdir מציג [ 'june.txt' ]. בקוד אמיתי בנו את הנתיבים האלה עם path.join כדי שיעבדו גם ב-Windows.

טעויות נפוצות

להניח שהקובץ נכתב מיד אחרי הקריאה. fs.writeFile חוזר לפני שהנתונים בדיסק. קראו את הקובץ או התחילו את הצעד הבא בתוך ה-callback, או עשו await לגרסת ה-promise.

לאבד נתונים בכתיבה בתוך לולאה. קריאה ל-writeFile פעם אחת לכל פריט מחליפה את הקובץ בכל פעם, ומשאירה רק את הפריט האחרון. השתמשו ב-appendFile, או בנו את כל המחרוזת וכתבו אותה פעם אחת.

לכתוב [object Object]. העברת אובייקט דרך String() או דרך template literal כותבת [object Object]. השתמשו ב-JSON.stringify.

שאלות נפוצות

האם fs.writeFile דורס את הקובץ?

כן. עם דגל ברירת המחדל 'w' הוא מרוקן את הקובץ וכותב את הנתונים החדשים, כך שהתוכן הישן נעלם. העבירו { flag: 'a' } או השתמשו ב-appendFile כדי להוסיף לסוף במקום.

האם fs.writeFile יוצר את הקובץ אם הוא לא קיים?

כן, הוא יוצר את הקובץ. אבל הוא לא יוצר תיקיות חסרות: כתיבה ל-logs/app.log כש-logs לא קיימת נכשלת עם ENOENT.

מה אפשר להעביר בתור הנתונים?

מחרוזת, Buffer או typed array. כל דבר אחר, כמו אובייקט או מספר, זורק TypeError, אז המירו אובייקטים עם JSON.stringify ומספרים עם String() קודם.

האם בטוח לקרוא ל-writeFile הרבה פעמים במקביל על אותו קובץ?

לא. שתי קריאות writeFile במקביל על קובץ אחד יכולות להשתלב זו בזו ולהשאיר תוכן מעורבב. חכו שאחת תסתיים לפני שמתחילים את הבאה, או אספו את הנתונים וכתבו פעם אחת.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל