
Image.FromFile("myPick.jpg")). בהרצה מתוך Visual Studio הקובץ נמצא כי התיקייה הנוכחית הייתה תיקיית קובץ ההפעלה, אבל אצל הלקוח הקובץ לא נמצא.C:\... לא אפשרי, כי אצל הלקוח אין בהכרח אותו מבנה תיקיות.Application.StartupPath, שמחזיר את התיקייה שבה נמצא קובץ ההפעלה, בלי קשר לתיקייה הנוכחית.#if DEBUG ... #else ... #endif. בוויז'ואל סטודיו הסימבול DEBUG קיים כברירת מחדל במצב Debug, ולכן הקוד שבתוך הבלוק הזה נכנס לקובץ ההפעלה רק במצב זה.Globals.ImagePath) נכתב פעם אחת בלבד, והערך משתנה לפי המצב.Process.Start, ושינוי צבע הרקע לפי המצב. ההגדרות מרוכזות במחלקה סטטית אחת.הטקסט המלא של הדקות הראשונות בהרצאה «מצב Debug מצב Release» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כעת אנחנו הולכים לראות משהו שהוא לא קשור רק לפרויקטי Windows Forms Application אלא הוא קשור לכל פרויקט שהוא בדוטנט אבל אנחנו הולכים להציג אותו על ווינפורם ומה שאנחנו הולכים לראות זה מה ההבדל בין פיתוח במצב דיבאג שאנחנו יכולים לראות כתוב כאן לבין פיתוח במצב ריליס שאנחנו יכולים להחליף אותו לכאן אז יכול להיות ששמתם לב שיש לכם את האפשרות
לפתח עם ה-checkbox הזה או ליתר דיוק עם ה-combo-box הזה במצב דיבאג או במצב ריליס ויכול להיות שגם ראיתם שיש שתי תיקיות שנוצרות לכם, אחת דיבאג ואחת ריליס וכעת אנחנו הולכים לראות בדיוק מה ההבדלים ביניהם וגם מה זה שתי התיקיות האלה שנוצרות.
אז בואו נבין קודם כל מה ההבדלים. ההבדלים או ליתר דיוק המטרה של שני המצבים האלה זה להוות שני מצבים שונים מצב דיבאג זה מצב בו אני בזמן הפיתוח ואני בתור מתכנת בונה את המערכת שלי וכאשר זה מתרחש אני רוצה להיות במצב דיבאג כאשר אני במצב דיבאג אני יכול להגדיר כל מיני הגדרות שיהיו תקפות רק עבור המצב הזה עוד מעט אנחנו נראה דוגמה למה כדאי לי לעשות את זה מצב ריליס זה מצב שבו
אני רוצה לעבור רק כאשר אני נמצא בפרודקשן מה שאני כלומר אחרי שסיימתי לפתח את המוצר שלי או את התוכנה ואני נותן אותה ללקוח או מתקין אותה במחשב הלקוח אני רוצה ששם יהיה לי מצב ריליס כי שם יכול להיות שיש לי הגדרות אחרות שאני רוצה שיהיו תקפות ולכן כאשר אני מעביר את זה למצב ריליס
מיידית הולכות להיכנס הגדרות אחרות שאני כמובן צריך לדאוג לזה ולהגדיר אותן כמו שצריך אז בואו נראה דוגמה בגלל שאנחנו כרגע בפיתוח בואו נעבור רגע לדיבאג ובואו ניקח דוגמה מאוד מאוד פשוטה, והדוגמה הזאת היא דוגמה שבה אני רוצה לקחת איזשהו לחצן, בואו נגדיר שהלחצן הזה טוען איזושהי תמונה
ומציג אותה. יש לנו פה לחצן, כתוב עליו show image, נתנו לו שם, יוזר לוחץ עליו ואנחנו רוצים לראות איזושהי תמונה שקיימת בהארדיסק.
בואו נלך לפורמט, נגדיר center inform horizontal שהוא יהיה בדיוק באמצע, ומה שאני רוצה לעשות, אני רוצה לקחת איזשהו אובייקט פיקצ'ר בוקס שים אותו כאן, נגדיר אותו בצורה כזאת אני לוחץ על הלחצן ואני רוצה לגשת ולטעון תמונה מההארד דיסק ובוא נניח שאני גם יודע בדיוק איזה תמונה זאת, כן?
אני שמתי אותה לפני זה ואני פשוט רוצה להציג אותה. אתם יכולים לחשוב על הרבה יישומים לזה שתרצו לטעון תמונה בהארד דיסק, יכול להיות שתרצו להציג תמונה למשתמש, להציג את התמונה שלו, יכול להיות שאתם רוצים לעשות אפילו שומר המסך שטוען תמונות שהגדרתם ומציג אותם לפי הסדר, יש לזה המון יישומים.
אוקיי, אז איזו תמונה נגדיר? בואו ניכנס לתוך הלחצן, ניגש לרכיב של התמונה שעוד לא נתתי לו שם, אז בואו ניגש לכאן וניתן לו pick, נניח main image.
כל מה שאנחנו רוצים לעשות זה pick main image, image שווה המחלקה image נקודה פונקציה from file ואנחנו רוצים לטעון איזושהי תמונה בואו נניח נקרא לתמונה הזאת מייפיק נקודה jpeg ויש לנו כרגע טעינה של תמונה שנקראת מייפיק נקודה jpeg והיא מוצגת בדיוק ברכיב של הפיקצ'ר בוקס
בכדי שהתמונה גם תוצג כמו שצריך בואו ניתן לה איזשהו מאפיין בסייז מוד בסייז מוד ניתן לה, בואו ניתן לה סטראץ' אימג' בכדי שהיא תימתח בדיוק.
אוקיי, אז השאלה עכשיו היא איפה נמצא הקובץ הזה? כאשר אני כותב רק שם של קובץ, השאלה היא איפה בדיוק המערכת, איפה דוטנט מחפשת את הקובץ הזה.
בואו נריץ, ונראה שכמובן בגלל שאין לי שום קובץ כזה, לפחות לא בפרויקט או איפה שקובץ ה-execution נמצא אני אמור לחטוף איזושהי חריגה, איזושהי exception והוא כותב לי unhanded exception as occurred בואו נראה detail והוא כותב לי פה file not found
בסדר, ברור, ניסיתי להגיד לו תקשיב יש פה איזו תמונה אני חייב אותה והיא לא נמצאת שם אז כמובן שהוא קרס והשאלה היא איפה אני צריך לשמור את הקובץ הזה אז קודם כל בואו נמצא לנו איזשהו קובץ כזה ושמתי פה בדסטופ קובץ שנקרא mypeak.jpeg.
בואו ניקח את הקובץ הזה, נעשה לו את ובואו נדביק אותו ביחד עם קובץ האקסקיושן. אני לוחץ מקש אם אני על הפרויקט ואני הולך לopen folder in windows explorer ואני רואה שיש לי פה תיקיית בין.
אני נכנס אליה ואני רואה שיש לי שתי תיקיות דיבאג וריליס איפה נמצא קובץ אקסקיושן תלוי מה המצב שלי מה המצב שבו אני מתכנת כרגע בגלל שאני מתכנת בדיבאג אז קובץ האקסקיושן אמור להיות בתוך תיקיית דיבאג ואכן אני רואה שיש לי פה את הקובץ דיבאג אנד ריליס וכל מה שאני עושה אני שם כאן את התמונה ביחד עם קובץ האקסקיושן אם אנחנו ניכנס רגע לראות
מה יש בתיקיית ריליס אז אנחנו נראה שאין לנו פה קובץ אקסקיושן של התוכנית שלנו, יש לנו קובץ אחר שנקרא בשם האפליקציה דיבאג אנד ריליסט נקודה vshost.
זה קיצור של ויז'ואל סטודיו הוסט, וזה קובץ אקסקיושן לשימוש פנימי של ויז'ואל סטודיו, שעוזר לויז'ואל סטודיו להריץ את האפליקציה שלנו.
אנחנו יכולים גם בדיבאג לראות שקיים קובץ כזה, הנה הוא כאן, הוא לא קשור אלינו והוא לא קשור ללקוח, ואנחנו לא צריכים לתת אותו ללקוח, זה רק קובץ לשימוש פנימי של Visual Studio.
הקובץ של ה-execution זה כמובן הקובץ בעל שם ה-execution. אנחנו רואים שהשם של הפרויקט שלנו זה debug and release, רואים את זה כאן. אנחנו רואים שזה השם של האפליקציה שרואים אותה פה, של הפרויקט.
אם אנחנו נכנס ל-properties אנחנו נראה שיש לנו פה שם שנקרא assembly name. ה-assembly זה פשוט קובץ execution או dll שנוצר ב-dotnet. ומה שכתוב פה זה ה-Assembly Name. דרך אגב, אנחנו יכולים לשנות את זה לדוגמה ל-Check Debug & Release.
בואו נשמור. נבצע קומפילציה, ויש לנו פה Build Debug & Release. קומפילציה יוצרת לנו קובץ Execution, ואם אנחנו ניכנס לתיקייה אנחנו פתאום נראה שהשם של ה-Execution עבר להיות Check Debug & Release מפני שהגדרנו בפרופרטיב
שזה יהיה השם של ה-Execution, כלומר של האסמבלי עצמו. אז אם שמתי את התמונה ביחד עם קובץ אקסקיושן ועכשיו אני מריץ את קובץ האקסקיושן ואומר לו show image אני רואה שהכל בסדר הוא מצא לי את התמונה כי היא נמצאת ביחד עם קובץ האקסקיושן.
זה קרה כשעשיתי דאבל קליק על קובץ האקסקיושן. אם אני חוזר לוויז'ל סטודיו ולוחץ ctrl f5 ומריץ את התוכנית זה בדיוק אותו הדבר כאילו שהלכתי והרצתי את האקסקיושן.
אז אם אני לוחץ עכשיו על הלחצן show image אני רואה שהוא מצא אותה. אז בעצם אנחנו למדים מזה שאם אני רושם את הקובץ עצמו בלבד בלי נתיב אז המערכת מחפשת אותו בתיקייה של קובץ אקסקיושן והאמירה הזאת היא לא מדויקת ולא נכונה ואנחנו כבר הולכים לראות למה.
בואו נניח שיש לנו עוד משהו שקיים בתוכנית. בואו נניח שיש לנו ללקוח הכוונה עוד איזשהו לחצן. לא משנה כרגע מה בדיוק המטרה שלו. נשים פה איזשהו לחצן, אפילו נגדיר שהלחצן הזה ילך לתכונות, נקרא עליו טסט.
ומה שאנחנו רוצים לעשות עם הלחצן הזה זה לגשת ולבצע open file dialog בואו ניקח open file dialog ניגש ללחצן ופשוט נשתמש בopen file dialog show dialog נקבל dialog result ונבדוק אם result שווה ל-ok אז נציג במסג'בוקס את open file dialog file name אפילו אנחנו לא פותחים שום קובץ אפילו הצגנו את זה בואו אפילו נפתח את הקובץ process.start
open file dialog 1.file אין שום קשר בין הקובץ שאני רוצה כרגע להציג לבין התמונה שאני הולך לפתוח, סתם קובץ אחר.
בואו נקרא לזה opening file, סבבה. עכשיו אנחנו הולכים ואנחנו יוצרים כאן איזשהו קובץ טקסטואלי. בואו נקרא לזה myfile.txt, בתוך הקובץ נרשום Hello ונסגור את הקובץ.
יש לנו קובץ על הדסטופ, הוא לא קשור לשום דבר. אנחנו מריצים את התוכנית, אנחנו לוחצים על show image, והכל בסדר.
אני סוגר, מריץ את התוכנית, לוחץ על test, ונפתחת לי התיבה שאומרת בוא תבחר קובץ. אז אני הולך לדסטופ, והיא אומרת בדסטופ יש לי את myfile בבקשה אני רוצה לפתוח אותו.
open. והנה אני רואה את ההודעה opening file myfile.txt ומיד לאחר מכן המערכת פותחת את הקובץ. הכל בסדר עכשיו אני לוחץ על show image ואני חוטף exception איך זה יכול להיות הרי לפני שנייה זה עבד ופתאום זה לא עובד מה בדיוק קרה כאן אז אני חוזר על האמירה שאמרתי מקודם אם אנחנו מגדירים רק שם של קובץ לצורך קריאה
או כתיבה או חיפוש או איתור או פתיחה לא משנה מה הדבר הזה זה לא מספיק חזק ובואו נבין מה בעצם קרה כאן מה שקורה כאן זה שישנה במערכת ההפעלה תיקייה אחת ויחידה בכל רגע נתון שנקראת the current directory התיקייה הנוכחית.
דרך אגב אנחנו יכולים להשיג או לראות אותה על ידי הפקודה environment.get current directory או current directory הנה זה פה current directory זאת התיקייה הנוכחית וזה סטרינג.
בואו נריץ פה message box, נרשום פה current directory, נשרשר את זה עם הדבר הזה ונריץ שוב. נלחץ על show image ונראה שה-current directory, שימו לב, c, Windows forms application, 19, debug and release, debug and release זה התוכנית שלנו,
בין דיבאג. כלומר, אנחנו רואים שה-current directory זאת התיקייה של קובץ ה-execution. זאת אומרת, אם אני עוד פעם אלך ואתר את קובץ האקסקיושן, האמת שהוא כבר נמצא לי פה פתוח, אז קובץ האקסקיושן נמצא בדיוק בנתיב הזה שאני רואה פה למעלה,
וזה בדיוק אותו נתיב שכרגע מוצג לי. וכאן אנחנו רואים שברגע שאנחנו מריצים אפליקציה, מערכת ההפעלה מגדירה את ה-Core and Directory כתיקייה של האפליקציה.
זאת הסיבה שאנחנו ראינו שה-Core and Directory זאת עכשיו אני סוגר ואני מריץ את זה עוד פעם, אני לוחץ על טסט ואני עושה בדיוק את מה שעשיתי מקודם, אני ניגש לדסטופ, בוחר את הקובץ הזה My File ואני אומר בוא נפתח אותו ואני רואה שאני הולך לפתוח את הקובץ הזה שנמצא לי בדסטופ ואני אומר לו אוקיי הנה
הקובץ נפתח הכל בסדר, עכשיו אני לוחץ עוד פעם על ה-show image ופתאום אנחנו רואים שהקורן דירקטורי הפכה להיות תקייה אחרת והיא הדסטופ.
למה? מפני שמערכת ההפעלה רואה שאיזושהי תוכנה עשתה שימוש בתיקייה אחרת. אנחנו ראינו שאנחנו ניסינו לפתוח קובץ מהדסטופ, ולכן מערכת ההפעלה שינתה את ה-Core and Directory, שהיא תיקייה אחת ויחידה בכל רגע נתון במחשב, לתיקייה האחרונה שווינדוס עושה בשימוש, וזה
בעצם הדסטופ. כאשר אנחנו מנסים לקרוא קובץ או לכתוב קובץ או להתייחס לקובץ רק לפי השם שלו ולא לפי נתיב מלא, בפרויקט של ווינפורם או בפרויקט של קונסול אפליקיישן או בדי.אל.אלים לא ב-Web, הרעיון פה זה לא Web, זה פרויקט דסק-טופ הכוונה, כמו ווינפורם,
אז Windows תחפש את הקובץ הזה ותנסה לאתר אותו לא בתיקייה של קובץ ה-Execution, אלא בתיקיית ה-Current Directory, בתיקייה שמוגדרת כרגע ב-Windows כ-Current Directory.
למה זה עבד בהתחלה? כי כאשר הרצנו את התוכנית בפעם הראשונה, אז ווינדוז הגדירה את הקורים דירקטורי כתיקייה של קובץ אקסקיושן ולכן הצלחנו לאתר את התמונה במקום הזה.
אבל מה קורה אם היוזר הולך ועושה איזושהי פעולה, עוזב את התוכנית שלנו, הולך לתוכנית אחרת, משנה את התיקייה האחרונה שהוא עשה בשימוש, חוזר בחזרה ואז מנסה לטעון את הקובץ?
כמובן שהוא יחטוף פה באג רציני, בדיוק כמו שקרה עכשיו. אז אנחנו לא יכולים להרשות לעצמנו דבר כזה. לכן באפליקציות ווינפורם, באפליקציות דסטופ רגילות, אנחנו אף פעם לא יכולים להתייחס לקובץ רק לפי השם שלו.
אנחנו חייבים תמיד להתייחס לנתיב המלא. אוקיי, אז כל ההדגמה הזאת הייתה רק בשביל להבין את העיקרון של ה-Corented Directory, ובשביל להבין למה אסור לנו להתייחס לקבצים רק לפי השם שלהם והסיומת, אלא חובה להשתמש פה בכל הנתיב המלא.
אז מה הבעיה? בואו נגדיר את הנתיב. אז מה הנתיב? אנחנו יכולים ללכת להעתיק את כל הנתיב שכתוב פה ללכת לכאן להדביק את כל הנתיב ביחד עם סלאש והשם של הקובץ.
שימו לב רק שאנחנו חוטפים פה מלא שגיאות קטנות על ה-backslash מפני שאנחנו יודעים ש-backslash זה תו מיוחד בתפוצות C כמו C, C++, Java, JavaScript, C-Sharp וכולי ולכן לדוגמה backslash n מתאר ירידת שורה ולכן כל הבקסלשים האלה מפריעים ולא ניתן לכתוב אותם בצורה כזאת,
אז יש שתי שיטות, או שאנחנו משכפלים כל בקסלש ואז אנחנו בעצם אומרים ל-C-Sharp שאנחנו רוצים להתייחס לבקסלש רגיל ולא לתו מיוחד כמו בקסלש N, או הכי פשוט זה להגדיר שטרודל בתחילת המחרוזת וזה מגדיר שכל הבקסלשים במחרוזת הם לא תווים מיוחדים אלא הם בקסלש סטנדרטי כמו בקסלש של
נתיב. אם אנחנו עכשיו הולכים להריץ את התוכנית שלנו, אז כמובן שהדבר הזה הולך לעבוד בשני המקרים. בואו נריץ מקרה ראשון ואנחנו רואים שהתמונה נמצאה.
בואו נסגור. בואו נריץ שוב פעם. נשנה את ה-current directory. אני מריץ את זה. אני משנה את ה-current directory.
נעשה open. נפתח את הקובץ. ה-current directory השתנתה. אבל אם אני לוחץ על התמונה, אני כבר לא נמצא בשם של קובץ נקי, אלא נתיב מלא, אז זה לא משנה מה ה-Cורן דירקטורי.
אני אמרתי ל-C-Sharp, אני רוצה לגשת ספציפית לקובץ הזה. מה אכפת לי מה ה-Cורן דירקטורי שמוגדר כרגע במחשב של המשתמש? אז קודם כל אנחנו רואים שזה עובד.
השאלה היא, האם אנחנו נעשה דבר כזה? והתשובה היא, לא, בהחלט לא. למה? מפני שאנחנו עכשיו צריכים לחשוב שבסופו של דבר האפליקציה שאנחנו בונים הולכת להיות מותקנת על מחשב של לקוח וכל ה-viewpoint שלנו צריך להיות כזה שאנחנו בסופו של דבר נותנים את המערכת הזאת למישהו אחר.
האם למישהו האחר הזה שאנחנו נותנים, כלומר ללקוח, הולך להיות בדיוק נתיב כזה במחשב שקובץ אקסקיושן הולך לשבת בצורה יפה בדיוק בנתיב הזה?
תשובה ברור שלא. הנתיב הזה קיים אצלי במחשב, הוא לא קיים במחשב של המשתמש שלי. אולי בכלל אין לו קונן שיא, לא חייב שלמחשב יש קונן C, יכול להיות שכשהוא התקין את Windows הוא בחר שהקונן המרכזי של Windows בכלל נקרא E או שנקרא D או שנקרא G, ראיתי כבר מחשבים כאלה, לא חייבים קונן C, בכלל לא בטוח שיש לו את קונן C, אז אנחנו לא יכולים להתייחס ברוב המקרים לנתיב מלא אלא
אם כן אני כותב תוכנה שאני בטוח לגמרי איפה היא הולכת לשבת באיזשהו רשת פנימית של חברה ואני יודע בוודאות שתמיד יש שם קובץ. ברוב המקרים זה לא המצב אז פה אני נכנס לבעיה אני אומר לעצמי רגע רגע נתיב מלא אני לא יכול להשתמש נתיב יחסי כמו שעשינו מקודם בצורה כזאת אני גם לא יכול מפני שזה לא יהיה נכון כי זה לא באמת
הנתיב של קובץ אקסקיושן אלא זה הנתיב של הקורן דירקטורי אז אני נמצא פה בבעיה אני רוצה שהמערכת תאתר לי תמיד את המיקום של התיקייה הנוכחית ואנחנו יכולים לעשות את זה על ידי הפקודה application.startuppath אם אנחנו עכשיו עובדים עם הפקודה הזאת בואו נהיה עקביים ממה שעשינו מקודם יש לנו פה שטרודל
ויש לנו פה backslash mypeak jp אם אנחנו עכשיו עובדים עם הפקודה application.startuppath הפקודה הזאת בעצם מביאה לנו את הנתיב לתיקייה שבה נמצא קובץ האקסקיושן לא משנה מה ה-Cורן דירקטורי, זה לא מעניין את המערכת מהו ה-Cורן דירקטורי, אנחנו אפילו יכולים להגדיר את זה בצורה כזאת.
אני מציג גם את ה-Cורן דירקטורי ואני מציג גם את אפליקיישן סטארט-אפ פאף. שני הדברים האלה אני אציג, אפליקיישן סטארט-אפ פאף, אני אריץ בשני המקרים.
מקרה ראשון, לוחץ על הכפתור, קורן דירקטורי זה התיקייה של קובץ ה-execution, אנחנו רואים בדיוק את הנתיב הזה, ואפליקיישן נקודה סטארט-אפ פאס זה אותו נתיב אז הכל בסדר בואו נסגור נריץ את זה כאשר אנחנו משנים את הקורן דירקטורי בצורה כזאת בחרנו איזה קובץ עשינו איזה פעולה מסוימת שינינו
את הקורן דירקטורי לדסטופ ועכשיו אנחנו לוחצים על הלחצן show image קורן דירקטורי מצביע על הדסטופ אבל אפליקיישן נקודה סטארט-אפ פאס זה הנתיב של קובץ אקזקיושן אז הכל בסדר והוא מצליח לעבוד ופה אנחנו רואים שהבעיה מתחילה להיפתר היא לא
נפתרת לגמרי היא מתחילה להיפתר וכעת סוף סוף אנחנו הולכים לראות איזשהו שימוש בקונספט של הדיבאג והריליס שלכאן אנחנו חותרים. נראה שהצלחנו להתגבר על הבעיה הזאת שכל הבעיה הייתה זה שיש לי איזשהו קובץ שאני מכיר אותו והוא נמצא אצלי ביחד עם קובץ אקסקיושן אנחנו יכולים לראות אותו כאן זה איזשהו קובץ תמונה ויש לי את קובץ אקסקיושן ואני יודע לגמרי ששניהם יושבים באותה תקייה,
זה משהו שאני יודע, אני רוצה שזה יקרה. וכל מה שרציתי לעשות זה בתוכנית להתממשק בצורה דינמית לקובץ הזה ולהציג את התמונה. ואז התחלנו להתקל בסדרה של בעיות, לרשום רק את השם של התמונה אני לא יכול, ראינו למה, בגלל ה-Coring Directory, לרשום נתיב מלא אני לא יכול, ראינו למה, כי אצל הלקוח אני לא יודע שהנתיב הזה אכן קיים, אני בכלל לא יודע מה הנתיב שלו,
שהוא יחליט לשים את האפליקציה איפה שבא לו במחשב ולכן השתמשנו באפליקיישן נקודה סטארט-אפ פאף וזה בסדר ופה יש עוד סיטואציה אחת שאנחנו צריכים להבין ולטפל בה אפילו שזה נראה שהבעיה נפתרה והסיטואציה קשורה לפיתוח עצמו בכלל לא ללקוח כי אצל הלקוח זה
עובד פרפקט בואו נסתכל מה הסיטואציה שקיימת עבור מתכנתים והסיטואציה היא כזאת אנחנו עובדים בוויז'ל סטודיו במהלך הפיתוח ובוויז'ל סטודיו אנחנו בונים אפליקציה, בנינו מערכת ממש יפה, בנינו טופס עם לחצן ותמונה וכשאני לוחץ על הלחצן אני רואה את התמונה וזה ממש פרויקט עם קבצים והכל טוב ויפה.
ואיפה יושב לי כל הפרויקט? כל הפרויקט יושב באיזושהי תיקייה, בואו נעלה פה אחד למעלה, שני למעלה ונגיע לתיקייה של הפרויקט עצמו. הנה כל הפרויקט יושב כאן, אנחנו יכולים להעלות עוד תיקייה למעלה ולראות באמת את התיקייה עצמה של הפרויקט דיבאגן ריליס קראתי לזה וכל הקבצים שאנחנו רואים
כרגע הם הקבצים של הפרויקט עצמו אנחנו יכולים לראות פה את הקובץ sln שהוא אחראי על סדרה של פרויקטים אם יש לי כרגע אין לי אבל עדיין יש לי קובץ sln אנחנו רואים את ה-csproge שהוא אחראי על הפרויקט עצמו ברגע שאני לוחץ עליו wclick נפתח לי כל הפרויקט קבצי ה-csharp עצמם שמשתתפים בפרויקט קובץ
SEO שזה קיצור של Solution User Options שמכיל הגדרות של Visual Studio שכוללות איזה קבצי C-Sharp היו פתוחים, איזה קובץ אחרון השתסקתי איתו בשביל שכשאני פותח את הפרויקט בפעם הבאה כל הקבצים האלה חוזרים להיות באותה תמונה של Visual Studio כמו שהיו לפני זה שאני אוכל להמשיך לפתח אותו.
קובץ Resources שאנחנו יכולים להגדיר פה כל מיני משאבים. תיקייה עבור פרופרטיז ושתי תיקיות שנקראות בין ואובי ג'יי. אנחנו ראינו שבתיקיית בין קיימות שתי תיקיות דיבאג וריליס ותלוי באיזה מצב אני כרגע נמצא אז המערכת מייצרת לי בתוך המצב הזה נניח אם אני בדיבאג אז בתוך
תיקיית דיבאג יש לי לקרוא את זה אקסקיושן ולכן שמתי פה את התמונה מייפיק נקודת JPEG. עכשיו תיקייה השנייה בין אובי ג'יי סליחה זה תיקייה של ויז'ואל סטודיו עצמה שעושה בה שימוש כאשר היא מייצרת לנו את הקובץ אקסקיושן.
כל מיני קבצים פנימיים של ויז'ואל סטודיו שוויז'ואל סטודיו משתמשת איתם בשביל להצליח לייצר את האפליקציה.
מתכנתים לא נוגעים בקבצים האלה, זה לא בשביל שימוש של מתכנתים, זה בשביל שימוש של ויז'ואל סטודיו, תיקיית ה-OBJ.
סבבה. מה הקטע עכשיו של שתי התיקיות האלה? בגלל שהתיקיות האלה מחזיקות אקסקיושנים אז דבר ראשון הם מנופחות זה לא קבצי טקסט זה קבצים בינאריים והדבר הזה מנפח לי את כל הפרויקט בסדר זה מה שצריך אבל בואו נחשוב רגע מבחינת פיתוח אנחנו עובדים קשה ובונים אפליקציה בדרך כלל אפליקציה שאנחנו
בונים זה לא יום ולא יומיים וגם לא חודש יכול להיות שאנחנו עובדים על אפליקציה המון זמן והרבה פעמים קורה שאנחנו לדוגמה רוצים לעשות גיבוי מה זה אומר לעשות גיבוי זה אומר אפשר לעשות לדוגמה קובץ רער, אין בעיה.
אפשר לעשות קובץ רער מכל התיקייה של הפרויקט שלנו. אבל כאשר עשיתי עכשיו קובץ רער, אז בתוך הקובץ הזה יושבים להם אקסקיושנים. ויש לי שתי בעיות עם הסיטואציה הזאת, שיושבים לי פה קבצי אקסקיושן.
בעיה ראשונה זה שהקובץ הזה מנופח, הוא קצת גדול, אם אני מסתכל על הפרופרטיז שלו, אני רואה שהוא כרגע 142 קילו. אולי זה לא בדיוק קובץ גדול אבל אין לי פה 142 קילו, רשמתי פה כמה שורות קוד למה הוא 142 קילו ולפעמים הוא מגיע לכמה מאות ג'יגה או כמה עשרות ג'יגה.
וכל הניפוח הזה זה בגלל התיקיות האלה בין ואובי ג'יי, זה לא בגלל הסורס קודים, אולי בגלל תמונות שיש שם, אולי בגלל דברים נוספים אבל התיקיות האלה טיפה מנפחות לי את הנפח של כל הפרויקט.
אז קודם כל אם אני רוצה להתחיל לעשות גיבויים ולשמור לעצמי גיבויים אז אני רואה שהוא טיפה מנופח אבל זו בעיה פחות רצינית. הבעיה האחרת שיש לי זה בגלל שיש לי פה קבצי אקסקיושן אז יש מקומות שאני לא יכול להשתמש עם הקובץ רר הזה לדוגמה אני לא יכול לשלוח את הקובץ רר לג'י מייל או לאימייל אחר מפני שאימיילים חוסמים
קבצי רר שיש להם בתוכם קבצי אקסקיושן. יש כל מיני שיטות לעקוף את זה לדוגמה אנחנו יכולים במהלך היצירה של קובץ ארר, כאשר אנחנו יוצרים קובץ ארר אנחנו יכולים להיכנס ל-Add to Archive ולהגדיר Advanced ולהגדיר Set Password, ואז לתת איזושהי סיסמה, לדוגמה 1234, 1234, להגיד Encrypt File Name זה חובה,
אם אנחנו לוחצים על Show Password אנחנו דרך אגב רואים את הסיסמה השנייה, אנקריפט פיילניים חובה אחרת ג'ימייל יצליח לראות מה קבצים ועדיין ידע שיש שם אקסקיושנים.
לבצע אוקיי אוקיי ואז יצרנו קובץ מכווץ של כל הפרויקט אבל שהוא מכיל סיסמה וג'ימייל לא תצליח לבדוק מה יש בתוכו זאת אומרת שיש אפשרויות לעקוף את זה ושאף אחד לא ידע שיש לנו קבצי אקסקיושנים אבל עדיין שימו לב דרך אגב שאני לוחץ על wclick בשביל לפתוח אותו אז הוא ידרוש ממני כמובן סיסמה רק אם אני אכניס את הסיסמה הנכונה אז הוא יסכים לפתוח ולהציג לי את הקובץ הזה.
עדיין זה לא מה שהרבה מתכנתים עושים, ומה שמתכנתים עושים זה פשוט מאוד מעיפים את שתי התיקיות האלה, מוחקים אותן לגמרי. אם אני אנסה למחוק אותן עכשיו אני לא אצליח מפני שוויז'ואל סטודיו פתוחה ומשתמשת איתן, אבל אם אני אסגור כרגע את ויז'ואל סטודיו אז אני אוכל ללכת, בואו נסמן אותן, אני מקווה שאני אצליח למחוק אותם כי השתמשתי
שם עם איזושהי תמונה. כן, הצלחתי. ועכשיו בעצם אני יכול לבצע קובץ רער. אין צורך לבצע עכשיו הצפנה לקובץ או סיסמה. נבצע קובץ רער, נסתכל על הגודל שלו ונראה שממ-140 ומשהו קילו עברנו ל-12 קילו, זאת אומרת שהוא הרבה הרבה יותר מצומצם, אין בתוכו קבצי אקסקיושן,
והרבה יותר קל לי לעשות גיבוי לדבר הזה. אני יכול לשלוח אותו לג'י-מייל שלי, אני יכול לשלוח אותו לכל מיני מקומות אחרים בעולם, אני יכול לשלוח את זה לחבר שלי, אני יכול לעשות גיבויים.
הבעיה הייתה שתי התיקיות, בין והאובי-ג'יי, שמכילות הרבה קבצי אקסקיושנים, הרבה דיאללים וכל מיני קשקושים שאני לא באמת צריך אותם. זה שימוש פנימי של ויז'ואל סטודיו. אז מה שקרה כאן כרגע זה שפשוט הרבה פעמים מוחקים את קבצי הבין וה-OBJ בשביל לבצע גיבויים בשביל להעביר את הפרויקט ממקום למקום בשביל לשלוח אותו למישהו אחר הרבה
פעמים מבצעים את המחיקה הזאת וזו נקודה שאנחנו צריכים להבין ואנחנו צריכים לבנות את כל המערכת בצורה כזאת שתאפשר לנו לבצע את המחיקה הזאת ואין שום בעיה למחוק את זה זאת אומרת אם עכשיו אני פותח עוד פעם את visual studio אני מריץ עוד פעם את visual studio ואני מריץ קומפילציה ctrl shift b
שימו לב פה למטה בילד סקסידד ואני נכנס עוד פעם אני רואה שוויז'ואל סטודיו יודעת לבד לייצר לי את הבין והאור בי ג'יי הזה היא לא צריכה שהתיקיות האלה יהיו שם ועכשיו אנחנו רואים שהכל בסדר וויז'ואל סטודיו יצרה לנו אותה ואם אנחנו נכנסים לתיקיית בין ובואו נראה באיזה מצב היינו היינו בדיבאג אנחנו רואים רק דיבאג נכנסים לדיבאג אנחנו רואים שיש לנו פה את האקסקיושן אבל
מה אנחנו לא רואים שקיים לא רואים שהתמונה קיימת אנחנו מקודם שמנו את התמונה במהלך הפיתוח ביחד עם קובץ האקסקיושן וזאת הייתה טעות כי עכשיו אנחנו יודעים שהרבה פעמים קורה שמתכנתים ואתם גם כנראה תרצו לעשות את זה מוחקים את תיקיות הבין והאובי ג'יי מעיפים אותם לגמרי וזה קורה הרבה ואנחנו לא
רוצים במהלך הפיתוח לשמור קבצים ביחד עם קובץ אקסקיושן אבל כאשר אנחנו נותנים את קובץ האקסקיושן ללקוח אנחנו כן רוצים שהתמונה תהיה ביחד עם הקובץ האקסקיושן והנה סוף סוף אנחנו מגיעים בדיוק לנקודה שבה במהלך הפיתוח אני רוצה הגדרה א' התמונה לא נמצאת ביחד עם קובץ האקסקיושן אבל כאשר אני נמצא אצל הלקוח ונתתי
ללקוח שלי את קובץ האקסקיושן והוא מריץ אותו התמונה כן צריכה להיות ביחד עם קובץ אקסקיושן ופה אנחנו רואים שתי הגדרות שונות הגדרה אחת תקפה למהלך הפיתוח שבה אני מפתח את התוכנית שלי בוויז'ואל סטודיו והגדרה אחרת תקפה למתי שהתוכנית רצה אצל הלקוח והנה כבר אנחנו רואים מקרה שבו אנחנו רוצים שני דברים שונים אחד יהיה תקף עבור דיבאג ואחד
כנראה יתקף עבור ריליס כאשר אנחנו נותנים את התוכנית ללקוח אז איך אנחנו עכשיו בכל הסיטואציה הזאת ויותר חשוב איך עכשיו אני מסיק בחזרה את התמונה בואו ניגש נסגור את visual studio נעשה כזה דבר אני איבדתי את התמונה כי מחקתי אותה אז אני אגש ואני אעשה טריק אני אשנה את השמות של התיקיות האלה אני אגש ל-recycle pin אני אאתר את בין, יפר, יסתור, ועכשיו אנחנו יכולים ללכת לדיבאג, לאתר את התמונה, קופי, בואו נשמור
אותה בדסטופ שיהיה לנו גיבוי לפחות, כי קודם מחקתי אותה מהדסטופ, חזור בחזרה וניפטר מבין, חזיר את שני אלה לשם המקורי שלהם, נלחץ עכשיו עוד פעם, ועכשיו אנחנו יכולים להגיע למצב שבו אנחנו יכולים לקחת את התמונה, לשים אותה כאן, וזה אמור לעבוד כמו שצריך.
פעם בטעות העברתי אותה. פי, נשאיר פה גיבוי, פייסט. בסדר, אז אם אנחנו עכשיו הולכים שוב פעם ומנסים להריץ את קובץ האקסקיושן, זה כמובן יעבוד, או ליתר דיוק את ויז'ל סטודיו עצמה, זה כמובן יעבוד כי החזרתי את התמונה.
אבל אנחנו רואים שזה לא פתרון טוב. זה לא פתרון טוב מבחינתנו לשמור קבצים במהלך הפיתוח, שימו לב, במהלך הפיתוח, בזמן שאנחנו בונים את המערכת שלנו, ביחד עם קובץ אקסקיושן בשתי התיקיות בין ואובי ג'יי, כי התיקיות האלה נתונות למחיקה.
הן תיקיות שנוצרות דינמית עם ויז'ואל סטודיו, וצריך למצוא פה פתרון אחר. בואו נריץ את זה, נראה שזה עובד כמו שצריך, ונטפל בסיטואציה הזאת.
הנה התיקיה הנוכחית, סבבה, עובד. אז איך נכון לעבוד? מה שאנחנו צריכים לעשות זה כזה דבר. אנחנו צריכים לדאוג לזה שהקבצים שאנחנו צריכים לעבוד איתם נמצאים כחלק מהפרויקט ולא נמצאים בקובץ אקסקיושן.
זה הנתון היציב הראשון. כי אנחנו צריכים לדעת שקובץ האקסקיושן נמצא באיזושהי תיקייה בוויז'ל סטודיו שנתונה למחיקה. אז איך אנחנו עושים את זה?
בואו נלך לתוכנית שלנו. נעשה Add Existing Item, נבחר את התמונה, אנחנו לא רואים אותה כי יש פה פילטר, נגדיר פה, תראה לי את כל הקבצים, הנה התמונה עצמה, נבצע Add, ואנחנו רואים שהתמונה נמצאת איתנו בקובץ ה-Execution, סליחה, ביחד עם קבצי הפרויקט.
אולי אפילו היה עדיף לבנות איזושהי תקיית Images, אם יש לי הרבה תמונות, אבל יש לי כרגע תמונה אחת, אז זה בסדר, אני אגדיר אותה כאן ביחד עם הקבצים של הפרויקט.
אם אני עכשיו מסתכל על הקבצים עצמם של הפרויקט אני רואה שהתמונה עצמה נמצאת ביחד עם קבצי הפרויקט ולא נמצאת בתוך התיקיות BIN ו-OBJ קודם כל אין סכנה שאם אני אמחוק את BIN ו-OBJ התמונה הזאת תימחק כי היא לא חלק מ-BIN ו-OBJ היא שייכת לקבצים של הפרויקט
גם אם הייתי צריך קבצים אחרים לעבוד איתם הייתי רוצה קבצי טקסט, וידאו, סאונד, כל דבר שאני רוצה שהתוכנית שלי תעבוד איתו אני לא רוצה שבמהלך הפיתוח כל הקבצים האלה יהיו ביחד עם קבצי האקסקיושן, אלא אני רוצה שכל הקבצים האלה ישבו ביחד עם קבצי הפרויקט, או אפילו בתתי תיקיות אחרות.
יכול להיות שאנחנו יכולים לפתוח פה תיקייה, או לפתוח כאן תיקייה, אפילו בואו נעשה את זה כי זה טיפה יותר מקצועי. נפתח פה תיקיית נניח Images, נעביר את התמונה הזאת לתוך Images, ונסתכל ונראה כרגע שקיימת לנו תיקיית אימג'ז ובתוכה יש את התמונה, הסאונד, לא משנה מה שאנחנו רוצים לעבוד איתו, אבל זה לא בין ואובי ג'יי.