
fs.const fs = require('fs')fs.existsSync('data') מחזיר true או false.fs.mkdirSync('data').fs.copyFileSync('data/sourcefile.txt', 'data/destfile.txt').fs.renameSync('data/destfile.txt', 'data/destination.txt').fs.unlinkSync('data/destination.txt').fs.readdirSync מחזירה את שמות הקבצים בתיקייה, ואפשר לעבור עליהם בלולאה.Sync, וגרסה אסינכרונית בלי סיומת. הגרסה האסינכרונית היא ברירת המחדל ב-Node.js, כי פעולה על הדיסק בשרת לא צריכה לחסום את כל הלקוחות. הגרסה הסינכרונית נוחה יותר בדוגמאות פשוטות, ולכן המרצה משתמש בה.created צריכה להופיע רק בתוך ה-callback של mkdir, ולא מיד אחרי הקריאה.הטקסט המלא של הדקות הראשונות בהרצאה «עבודה עם קבצים ב-NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא חדש שבו אנחנו הולכים להתעסק עם ה-File System, כלומר, מערכת הקבצים והתיקיות במחשב. כאשר אנחנו עובדים עם JavaScript בצד ה-Client בדפדפן, אין לנו גישה למערכת הקבצים והתיקיות שנמצאות אצלו במחשב, מפני שהדפדפן מריץ את
JavaScript פנימית בתוכו, זה נקרא Sandbox, כאילו ארגז חול כזה, והוא לא מאשר לג'אווה סקריפט לגשת לפייל סיסטם, למערכת הקבצים והתיקיות בצד של הקליינט, במחשב שלו, ולעשות מה שג'אווה סקריפט רוצה, מפני שאחרת אתרים היו יכולים לעשות וירוסים, למחוק קבצים, להעתיק קבצים, לגלות כל מיני דברים על היוזרים.
דפדפן תמיד חוסם את זה. יש אפשרות לעשות כמה דברים פשוטים בג'אווה סקריפט קליינט סייד, כמו לשמור קוקיז או לשמור כל מיני דברים בקליינט סייד בדיסק, דפדפן הוא זה שאחראי לזה והוא זה שעושה את זה בתיקייה מיוחדת בלבד וכמובן html עצמה יכולה לטעון קובץ לאפשר ליוזר לבחור איזשהו קובץ אבל רק בשביל לקרוא אותו או לשלוח אותו לשרת.
Node.js אולם כן מאפשרת גישה מלאה לדיסק אז בנושא הזה אנחנו הולכים לראות איך אנחנו יכולים לעשות פעולות נפוצות על קבצים, איך אנחנו יכולים לקרוא קובץ, איך אנחנו יכולים לכתוב לקובץ ועוד דברים.
אז הדבר הראשון שאנחנו רוצים לבצע זה לייבא את המודול שמאפשר לנו לבצע את זה. בואו נבצע פה קונסט, המודול נקרא fs, אז אני אקרא למשתנה fs. רקווייר של פייל סיסטם.
הדבר הראשון שאנחנו הולכים לראות זה כל מיני ביצוע פעולות כלליות על קבצים ותיקיות במחשב אז דבר ראשון בואו נבדוק האם קיימת לנו איזושהי תיקייה אם 0 נקודה אקזיסט עכשיו רוב הפונקציות כאן מגיעות בשתי גרסאות אם אני כותב 0 אקזיסט אני פשוט כאילו רוצה לבדוק האם קובץ או תיקייה קיימים במחשב אבל אם אני בוחר את הפונקציה
בלי הסיומת סינק אז בי דיפולט אני בחרתי את הגרסה של האסינק מפני שנוט ג'י אס אומרת לנו אם אתם מריצים איזושהי פעולה בסרבר סייד בנוט ג'י אס הגיוני שאתם תרצו שהפעולה הזאת לא תבצע בלוק לכל האקסקיושן של נוט ג'י אס בסרבר כי אחרת אתם בעצם תוקעים את כל הלקוחות שמבצעים שימוש בסרוויס שלכם לכן בי דיפולט זה אסינק אז אם אני כן רוצה להגיע לגרסה של הסינק,
אז אני משתמש בסינק. אז אני כרגע אשתמש בסינק, כי זאת הגרסאות הפשוטות יותר לשימוש, וממש בהמשך אנחנו נעבור ונשתמש בגרסאות של האסינק, כי זה בעצם שימוש יותר נכון.
אז יש לנו פה אקזיסט סינק, בוא תבדוק לי רגע האם הקובץ קיים, אבל עד שאתה לא אומר לי כן או לא, אתה בעצם תוקע לי את הזרימה של התוכנית, וברגע שאתה מסיים תגיד לי אם הוא קיים, והנה פה אנחנו רואים שהוא מחזיר לנו בולאן.
כל הפונקציות שהן סינק יכולות להחזיר את התשובה עצמה על ידי ריטאם. אז בואו נבדוק רגע האם קיימת לנו תיקייה בטובת הנוכחית, כלומר בתיקייה הנוכחית שלנו, שנקראת דאטה.
ולמעשה אני רוצה לבדוק אם היא לא קיימת, אז אני אהפוך את זה ל-NOT. אם היא לא קיימת אני רוצה ליצור אותה. אוקיי, איך אני יוצר? 0.mkdir ויש לנו את הגרסה של הסינק.
אז בוא תיצור לי בבקשה תיקייה שנקראת דאטה. בואו רגע נריץ את זה, כרגע אין לי פה תיקייה שנקראת דאטה ולכן הוא אמור ליצור לי. נו דאפ. והנה אני רואה שהוא יצר לי תיקייה שנקראת דאטה.
אם הייתי רוצה להריץ את כל הסיפור הזה בצורה א-סינכרונית, הדבר הזה היה הרבה יותר מורכב. אם כמובן לא הייתי עוטף את זה בפרומיס או מבצע אסינק והווייט לסיפור הזה, אז איך בעצם היינו יכולים לעשות את כל הסיפור הזה א-סינכרוני?
0.exist שימו לב שהיא מחזירה לי void אני לא יכול עכשיו לבצע פה בדיקה עם if או עם not וכולי מפני שהיא לא מחזירה לי תשובה אז היא אומרת לי כזה דבר תגיד לי באיזה תיקייה אתה רוצה לבדוק בואו ניתן לה את אותה תיקייה data ובינתיים שאני לא אשכח אני גם ארחק את התיקייה הזאת במחשב מהכתובת שלי אבל אז ראינו שכל הפונקציות האסינכרוניות מקבלות בעצם callback
ואנחנו רואים שהיא מקבלת איזשהו callback בולעני, אני רואה שהוא אומר לי exists והcallback תגיד לי אם הוא קיים או לא קיים.
אז בואו נבצע exists והנה כאן אני יודע אם הוא קיים או לא קיים. אם not exist, בסדר, אני רוצה לבנות בדיוק את אותו הקוד של מקודם, if not exist, מה אני רוצה לעשות?
fk, סליחה, 0.mk.mkdir אני רוצה לקחת את הגרסה האסינכרונית הזאת הדיפולטית mkdir make dir ותגיד לי איזה תיקייה אתה רוצה ליצור כי הרי היא לא קיימת אז בואו ניצור את data ואז אני לא יכול בעצם לבצע שום דבר אני לא יכול להגיד שהתיקייה נוצרה או משהו כזה אני חייב עכשיו לקבל תשובה לדעת מתי בעצם התיקייה נוצרה בכדי לדעת מה בעצם
לעשות הלאה יש לנו כאן הופה הוא נסגר לי רציתי רק לראות את התוכסה הנוספת שקיימת לנו, אז יש לנו כאן את זה והוא פשוט מקבל, איפה זה?
ויז'ואל סטודיו עדיין, ויז'ואל סטודיו קוד עדיין, יש להם פה את הבעיה הזאת, אחד, מה יהיה?
אני רואה שאני מסתבך איתו, callback, אז זה בעצם, הוא מראה לי פה שהcallback היא callback ללא פרמטרים, אוקיי? זה לא כזה משנה האופציות האלה, ולכן כל מה שנעשה זה נגיד לו, תשמע, הנה הקולבאק שבעצם מציינת שהצלחת לבצע את מה שאתה אמור לבצע, קונסול לוג done.
כאשר אם הייתי רוצה לרשום קונסול לוג done או created, בואו נקרא לזה created, אז הייתי יכול בהקשר הקודם לכתוב את ה-created פה, מפני ש-fs.mkdir.sync הייתה תוקעת לי את הזרימה של התוכנית עד ש-Node.js לא הייתה
מצליחה או מסיימת לחלוטין לבנות את התיקייה, כי זה גישה לדיסק, יכול להיות שהיה לוקח לה טיפה זמן יחסית ל-Execution רגיל, אז היא לא הייתה זזה מילימטר.
וכאן, ברגע שאני מגיע לקוד הזה, זאת אומרת שהוא כבר סיים ליצור את התיקייה. בהקשר הזה, לא היינו יכולים לכתוב את ה-Created כאן לדוגמה.
נניח שהייתי מריץ את הקוד הזה בצורה כזאת. זה לא היה ריצה נכונה, זאת לא הייתה ריצה נכונה. למה? מפני שזה אסינכרוני, זאת אומרת שהוא מתחיל לעבוד, ואולי הוא לא סיים ליצור את התיקייה, וכבר אני מציג לו created, או במקום לעשות לו, במקום להציג created, אני כבר רוצה לשמור לו קובץ בתוך התיקייה,
אני לא יכול. היא עדיין לא קיימת באמת בדיסק, או שכן או שלא, אני לא יודע. לכן, ברגע שאני עובד עם פונקציות אסינכרוניות, יש לנו את ה-issue הזה שאני חייב לדעת מתי הן מסיימות על ידי callback function.
בואו רגע נוריד את זה ונריץ את התוכנית שוב פעם ונראה שהוא יצר לי את התיקייה כמו מקודם. אז שוב אנחנו רוצים לראות מספר דברים עם קבצים ותיקיות רק בכדי לראות טיפה איך אנחנו עובדים עם הדיסק בעצם עם הפייל סיסטם אז בואו נראה עוד כמה דברים קטנים
אבל נעשה אותם בצורה סינכרונית כי זה קצת יותר נוח רק בשביל להבהיר את הרעיון. את זה האמת אפשר להשאיר כי התיקייה גם ככה נוצרה. בואו רגע ניפטר ממנה שוב פעם, נראה שהכל עובד.
התיקייה נוצרה אז הוא לא יבצע פה שום דבר ואנחנו רוצים לראות כמה דברים פשוטים נוספים. בואו נניח שאנחנו רוצים שיהיה לנו פה איזשהו קובץ בתוך התיקייה הזאת.
נקרא לקובץ הזה sourcefile.txt. I'm a sourcefile. Good. ואנחנו רוצים לבצע העתקה של הקובץ הזה. בואו ניקח את fs.copy file ואנחנו רוצים את הגרסאות של הסינק. שוב, בהמשך ממש מהר אנחנו הולכים לעבור לגרסאות של הסינק כאשר אנחנו נבצע כתיבה וקריאה מקבצים.
אז יש לנו data והתיקייה ובתוכה יש לנו sourcefile.txt ואנחנו רוצים לעשות קופי, בואו נייצר קובץ חדש data,