# מערך שיעור: קבצים — File, StreamReader/Writer📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים ידעו לשמור נתונים לקובץ ולקרוא אותם חזרה, עם ניהול משאבים נכון באמצעות `using`.

בסוף השיעור הסטודנטים צריכים: להשתמש ב-`File`/`StreamWriter`/`StreamReader` לכתיבה וקריאה, להסביר למה `using` נחוץ, ולעטוף פעולות קובץ ב-`try`/`catch` מתאים.

דגש קריטי: הדגישו שנתוני זיכרון "נעלמים" בסגירת התוכנית — זו הבעיה הבסיסית שכל השיעור פותר, ולא מובנת מאליה לסטודנטים שרק כתבו קוד קונסולה עד כה.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | הריצו תוכנית עם רשימה בזיכרון, סגרו וידגימו שהנתונים נעלמו |
| הרעיון: File.WriteAllText/ReadAllText | 15 דקות | הדרך הפשוטה ביותר |
| StreamWriter/StreamReader | 20 דקות | שורה-שורה, יעילות לקבצים גדולים |
| הבעיה: משאב לא סגור | 10 דקות | הראו (או תארו) קובץ "תקוע" בלי using |
| הרעיון: using | 15 דקות | סגירה אוטומטית, גם עם חריגה |
| try/catch סביב IO | 10 דקות | File.Exists + IOException יחד |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |

---

## דגשים להעברת השיעור

- ההדגמה הפותחת (נתונים "נעלמים" בסגירת תוכנית) חייבת להיות **מוחשית** — הריצו תוכנית עם List בזיכרון, מלאו אותה, סגרו וההריצו מחדש כדי להראות שהיא ריקה שוב.
- קשרו `using` בחזרה ל-`finally` שכבר מוכר מהיחידה הקודמת — "זה בדיוק אותו רעיון, בתחביר מובנה יעודי למשאבים".
- הפרויקט המסכם של היחידה (Naive Bayes) ישתמש בקריאת CSV גדול — כדאי לרמוז על כך כאן, כדי לחבר את הנושא לפרויקט שמתקרב.

---

## מושגים

**`File.ReadAllText`/`WriteAllText`** — קריאה/כתיבה שלמה בפעולה אחת.
**`StreamReader`/`StreamWriter`** — קריאה/כתיבה שורה-שורה, יעילים לקבצים גדולים.
**`using`** — מבטיח סגירת משאב אוטומטית, גם בחריגה.

---

## תרגיל חשיבה

**שאלת פתיחה:** "אם שוכחים לסגור `StreamWriter` שפתחתם לקובץ, ומריצים את התוכנית שוב מיד אחר כך — מה יכול להשתבש?"

**מהלך:** תנו לסטודנטים לשער — קובץ "נעול" על ידי התהליך הקודם, שגיאת גישה בהרצה השנייה, או נתונים שלא נשמרו בפועל (כי ה-buffer לא נוקה). הובילו לתובנה ש"סגירה" היא לא רק ניקיון קוד — היא בעלת השלכות אמיתיות על משאבי מערכת ההפעלה.

**מה המרצה מראה בסוף:** אם אפשר בבטחה, הדגימו קובץ שנשאר "תפוס" (למשל ניסיון למחוק אותו בסייר הקבצים בזמן שהתוכנית עדיין רצה בלי `using`/`Dispose`) — לעומת אותו תרחיש עם `using`, שבו הקובץ משתחרר מיד אחרי שהבלוק מסתיים.
