
FileIO.swift עם מחלקה FileIO.static let fm = FileManager.default.String מתוכן ה-URL של הקובץ.1.txt, קוראים ממנו, מעתיקים אותו ל-2.txt ומדפיסים את תוכן התיקייה, ורואים שני קבצים. כל הפעולות זורקות שגיאה, ולכן קוראים להן בתוך do-try-catch. כדאי להגדיר private init כדי שלא ייווצרו מופעים של המחלקה.הטקסט המלא של הדקות הראשונות בהרצאה «עבודה עם קבצים ב-Xcode - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים אנחנו רוצים להתחיל לדבר על שמירה ועל החזור של מידע ואנחנו נעשה את זה בסדרה של סרטונים שיעסקו בנושאים הבאים קודם כל אנחנו רוצים להתחיל ללמוד לעבוד עם קבצים אנחנו רוצים ללמוד לשמור קבצים, לקרוא מקבצים, להעתיק קבצים, למחוק קבצים, לדעת קצת איזה
קבצים נמצאים לי באיזה תיקייה וכן הלאה. ברגע שנסיים עם הקבצים אנחנו נרצה לדעת לשמור מידע בדרכים נוספות ב-iOS על ידי אובייקטים של User Defaults ואחר מכן אנחנו נרצה ללמוד על שמירת מידע וקבלת מידע מאתרי אינטרנט למשל עבודה עם Json אחר כך אנחנו נרצה לשכור את מערכת שנקראת Core Data שהיא בעצם דאטאבייס מקומי במכשיר גם
כן אבל כדאטאבייס כמערכת לניהול אובייקטים ולבסוף אנחנו נרצה לשכור כל מיני אפשרויות לשמור מידע בשירותי ענן מתקדמים ששם נוכל לשמור גם דאטאבייס וגם אותנטיקיישן וכן הלאה.
אז היום, כמו שאמרתי, אנחנו רוצים להתחיל לדבר על עבודה עם קבצים. בעבודה עם קבצים אנחנו רוצים ללמוד על למצוא נתיב לקובץ, לכתוב לקבצים, לבדוק אם קבצים מסוימים קיימים.
אנחנו נרצה לדעת לקרוא מקבצים, למחוק קבצים, להעתיק קבצים, נרצה לדעת מאפיינים של קבצים, למשל מתי הקובץ נוצר או השתנה, וחוץ מזה אנחנו גם נרצה לדעת איזה קבצים קיימים בתיקיה.
בכל הנושא של עבודה עם קבצים אנחנו נעשה שימוש באובייקט שנקרא File Manager, וה-File Manager עוזר לנו להשיג את כל הפעולות שציינו קודם.
כדי לעבוד עם ה-File Manager, הדבר הראשון שנרצה זה לקבל רפרנס לאובייקט הזה שנקרא File Manager, וכאן פשוט אנחנו נרצה להשתמש ב-filemanager.default, אוקיי? אנחנו נרצה לעשות משהו כמו let fm=filemanager.default.
זה הדבר הראשון שאני ארצה לדעת לעשות, ככה אנחנו מקבלים רפרנס לאובייקט המדובר. מהאובייקט הזה אנחנו נרצה לדעת איפה נמצאת תיקיית המסמכים של הפרויקט. אתם אולי יודעים שבעצם iOS היא מערכת הפעלה מאובטחת ולכן אני לא יכול לכתוב ולקרוא איפה שאני רוצה אלא רק בתיקיות שהוקצו לי לשם כך.
אז אנחנו עכשיו נעבור לסוויפט כבר ונראה איפה אנחנו שמים את כל הדברים האלה בצורה מסודרת. אז בואו נעבור ל-Xcode. יצרתי עבורנו פרויקט שנקרא files demo אז פשוט file new single v application ופשוט תקראו לפרויקט files demo אוקיי זה הפרויקט שיצרתי והוא פרויקט רג לגמרי כמו שאתם יכולים לראות.
עכשיו בתוך הפרויקט אנחנו נרצה לייצר קובץ חדש כדי לשמור את כל העבודה שלנו עם קבצים במקום מסודר אנחנו נקרא לקובץ שלנו file io אז כבר קוראים לו file בואו פשוט נוסיף פה io.sweep עכשיו שם הקובץ הוא נחמד ואנחנו גם נרצה לייצר מחלקה באותו שם אז file.io ופשוט קלאס, יפה.
עכשיו לגבי האובייקט הזה שדיברנו עליו בואו נגדיר אותו כתכונה סטטית ברמת המחלקה בצורה הבאה static let file manager שווה file manager נקודה default אוקיי כאן אנחנו בעצם מקבלים רפרנס לאובייקט המדובר.
עכשיו למה שאני אגדיר קובץ כזה ואני אגדיר את הכל סטטי אולי אתם שואלים את עצמכם אז התשובה זה שאני לא חושב שאתם יכולים לזכור את כל מה שאנחנו נדבר בשיעור היום ואתם תרצו שהכל יהיה לכם שמור בצורה מסודרת ונגישה.
אז אנחנו מגדירים משתנים ואנחנו מגדירים פעולות ונוכל להשתמש בהם בכל פעם שנרצה בלי לסקור יותר מדי את כל הנושא הזה בעל פה. אמרתי לכם יש לי את הפייל מנאג'ר אבל עכשיו אנחנו רוצים למצוא נתיב לתיקייה url עבור תיקייה שמותר לנו לכתוב בתוכה.
אז למעשה זאת תהיה פשוט פעולה סטטית סטטיק פאן ונקרא לה document directory url url for דוקומנט דירקטורי עכשיו המתודה הזאת זורקת שגיאה והיא תחזיר url אז בואו נאתר אותה כדרוז כל הנושא של עבודה עם קבצים עלולות להתרחש שגיאות למשל אין מקום בדיסק אין גישה למשל מסוים וכן הלאה למשל אם אתם מנסים
ליצור קובץ ואין לכם הרשאות אז אתם לא תוכלו לעשות את זה ואיימס היא מערכת הפעלה מאובטחת לכן כל המתודות שאנחנו נכתוב כאן הן יהיו מתודות שעלולות הוא יזרוק שגיאה ויהיה צריך להתמודד עם השגיאות בעזרת דרייב וקאנג'.
כאן אנחנו רוצים לקבל את התיקייה של המסמכים אז אנחנו נשתמש בפייל מנאג'ר אנחנו נגיד let url = file manager או fm כי הגדרנו אותו כבר למעלה וכאן אנחנו רוצים להשתמש במתודה הזאת שנקראת urls שהיא מחזירה מערך של urlים היא נקראת urls עבור search path in domain mask אז בואו נראה מה זה אומר search path אנחנו מחפשים את תיקיית המסמכים של הפרויקט אז אני אעשה פה נקודה ואני רושם documents folder
יש כל מיני דירקטוריסט נחמדים, יש למשל דירקטוריסט עבור תמונות ודירקטוריסט עבור קאש וכן הלאה. עכשיו, אלה תיקיות שמותר לאפליקציה שלי לרשום בהן, ואנחנו נחפש רק את התיקיות האלה שמותר לי לרשום בהן.
ה-Domain Mask, זה אומר איפה אני רוצה לכתוב. עכשיו, מותר לי לכתוב רק ב-User Domain Mask, אסור לי לכתוב בקבצי מערכת, אסור לי לכתוב במקומות ששמורים לנטוורקינג וכן הלאה, ולכן אנחנו נרצה לשמור רק ב-users home directory. עכשיו ה-users home directory זה אפליקציית הום דירקטורי, אוקיי?
אז אלה המקומות שמותר לי לרשום בהם. עכשיו, זה מערך של url'ים, ואנחנו יודעים שיהיה פה רק אחד, כי זה תיקיית המסמכים של האפליקציה.
ועכשיו אנחנו רוצים פשוט להחזיר את ה-url הזה. זאת דרך אחת לקבל את ה-reference לתיקייה, והיא דרך פשוטה וקלה, ואני חושב שהיא נפוצה יותר בשימוש באינטרנט, אבל אני אראה לכם עוד דרך אחת נוספת, שלדעתי יותר נוחה בסופו של דבר אז אני אמחק רגע את ה-fm.url ואנחנו נעשה fm.url אחד ופה יש לי מתודה יותר ארוכה אתם רואים והיא גם זורקת שגיאה אז טוב שעשינו פה זריקת שגיאה
וחוץ מזה זה אומר שאנחנו נצטרך לעשות טרייל לפני שאנחנו משתמשים במתודה עכשיו כמו שאתם רואים יש פה את אותם פרמטרים כמו קודם נכון זאת אומרת עדיין איזה תיקייה אני מחפש אז תיקיית המסמכים documents directory באיפה אנחנו מחפשים אותה אז רק בuser domain masks לא בכל המקומות כי אז אני אקבל הרבה תיקיות וזאת התיקייה שמותר לי לכתוב לתוכה כאמור עכשיו
הסעיף הזה של appropriate for זה אם אני רוצה להעביר קובץ ממקום למקום ואני רוצה לקבל תיקייה באותו כונן אז אנחנו לא עושים את זה כרגע ואנחנו מעבירים פה ניל בצדק והאם ליצור זה הסיבה שאני משתמש במתודה הזאת אנחנו נרצה להגיד true כי אם במקרה מחקתם את תיקיית המסמכים באחד המשחקים שלכם אז ככה אתם יודעים שאוקיי אני מקבל את תיקיית המסמכים ואם היא
לא קיימת ניצור אותה זה בעצם סוגר לי הרבה e-failsים אז אני מעדיף את השיטה הזאת לקבל רפרנס לתקיית המסמכים שבפרויקט.
יפה. זה חלק ראשון מלקבל נתיב לקובץ, אני יודע שזה קצת עמוס אבל אנחנו נעשה עכשיו את החלק השני. אז עכשיו אנחנו רוצים url for file, וזה לא פחות חשוב, נכון?
ה-file הזה יישב בדוקומנטs דירקטורים. אז בואו נגדיר לעצמנו עוד פעם מתודה סטטית שעלולה לזרוק שגיאה, static func, ובוא נקרא למתודה שלנו url for file.
עכשיו המתודה הזאת תקבל את שם הקובץ, הוא יהיה סטרינג והיא תקבל גם פייל אקסטנשן אופציונלי והוא גם יהיה סטרינג אוקיי עכשיו למה אני אומר אופציונלי בואו נשים אופציונל ונגיד אפילו שזה שווה לניל כדי להשתמש בפעולה הזאת אז המשתמש שלנו יכול לעשות שתי דברים או להגיד לי פייל ניים שווה 1.txt ואז לסיים להעביר לא להשתמש בפרמטר השני
בכלל או שהוא יוכל להשתמש בשתי הפרמטרים ולהגיד פייל ניים שווה 1 אקסטנשן שווה txt אוקיי אז קיבלתי פה שתי פרמטרים עכשיו עכשיו המתודה הזאת אמורה להחזיר url לפי השם שלה, אז בואו נגיד שאנחנו מחזירים url, אבל היא גם עלולה לזרוק שגיאה, אז בואו נגיד שהמתודה
הזאת עלולה לזרוק שגיאה. אחר כך אנחנו נראה איך מתמודדים עם השגיאות, נכון? אנחנו נעשה בלוג של לתפוס שגיאה. אז כאן אני אומר שאני מחזיר url, וכדי לעשות את זה אנחנו שוב פעם משתמשים במתודה מלמעלה קודם כל, אז let directory שווה ל-url for documents directory.
עכשיו בגלל שזאת מתודה שזורקת צריך להיות פה ואני לא צריך לעשות פה בלוק של do-try-catch בגלל שאנחנו מתודה שמותרת כמתודה שזורקת שגיאה.
עכשיו, once יש לנו את ה-Documents Directory, אנחנו נייצר לעצמנו משתנה, נקרא לו FileURL, וה-FileURL הוא יהיה ה-Directory שלנו בתוספת השם של הקובץ, אז הפנדינג פאפ קומפוננט, ופה אנחנו מעבירים את פייל ניים.
עכשיו, אם קיבלנו אקסטנצ'ן, אז e.flat.ext שווה ל-file.ext שקיבלנו קודם, אזי אנחנו נרצה להגיד ש-FileURL, סליחה, הגדרתי אותו כלate, אז הוא צריך להיות var כדי שנוכל לעדכן אותו.
אז i, file url יהיה שווה ל-file url, נקודה, נוסיף לו גם את ה-extension. אז הפנדינג, path extension, ופה אנחנו נעביר את המשתנה הזה שהוא כבר לא אופציונל, וזה בעצם הנתיב לקובץ, אוקיי? אז return, file url.
עכשיו, אני יודע שזה קצת עמוס, אבל תשמחו שהגדרנו את כל זה כ-utilities, וזה פשוט יהיה לכם שמור אחר כך, ותוכלו להשתמש בזה בצורה חכמה ונבונה, אוקיי זה החלק הכי קשה בעבודה עם קבצים עכשיו אנחנו כבר יכולים ליהנות מהפירות שהגדרנו פה ולהתחיל לעבוד עם קבצים אז אנחנו נרצה להגדיר מתודה ראשונה של כתיבה לקובץ אחרי שהגדרנו את כל הדברים הקודמים יהיה לנו קל
לעבוד אני פשוט הולך למעלה מעתיק פה את המתודה הזאת מפה ואנחנו נערוך אותה קצת בסדר עד החזרת הערך פה כי אני לא מחזיר ערך עכשיו לא קוראים למתודה url for file בואו נקרא לה right to file עכשיו עכשיו אנחנו מקבלים את שם הקובץ ואת ה-Extension, אבל בנוסף אנחנו גם
רוצים לקבל את הדאטה מסוג String שאותו אנחנו רוצים לכתוב לקובץ. המתודה הזאת זורקת שגיאה, אז נהדר. שוב פעם, אותו שימוש כמו קודם, בסדר? או שמעבירים לי 1.txt או שמעבירים לי 1.txt, אוקיי? שתי אלה הן אופציות.
אז אלה ה-usages, מישהו יעביר לי FileName בלבד, ומישהו אחר יעביר לי גם FileName וגם Extension. יפה. כדי לכתוב לקובץ אז אנחנו בעצם רוצים קודם כל לקבל נתיב לקובץ שבשביל זה עבדנו כל כך קשה קודם אז let file url שווה url for file למתודה מלמעלה בואו ניתן לה את הפרמטרים שקיבלנו אז file name ואם קיבלנו גם extension נעביר
אותו גם כן אז זה הurl שלי עכשיו זאת מתודה שזורקת אז try בהתחלה זה א' יש לי את הנתיב שלה ואני רוצה לכתוב ב' יש לי את הסטרינג שאני רוצה לכתוב אותו נכון data נקודה אז זה הדאטה שלי עכשיו הכל מתחיל פה בtry אז דאטה נקודה סליחה רייט אוקיי עכשיו יש לנו פה מתודה שנקראת רייט הוא url רואים אז זאת המתודה שאנחנו רוצים
ויש לי את הurl זה הפייל url עליהו ובואו נתאים אותו פה הפרמטר הבא אם אני רוצה לכתוב בצורה אטומית אז בטח שכן נהדר ובאיזה אנקודינג באיזה צ'רקטר סט אנחנו רוצים להשתמש אז utf-8 יפה אז הנה מתודה שכותבת לקבצים כמו שאתם רואים החלק המעיק פה זה הקבלת נתיב לקובץ אבל מה לעשות שה-iOS כזאת מאובטחת ושמורה.
אז הנה, יש לי מתודה אחת שכותבת לקובץ. יפה. אנחנו יכולים לקרוא לה והיא תכתוב לקובץ, אבל אנחנו לא נראית את התוצאה עדיין, אז בואו נתקדם הלאה, בסדר? בואו נתקדם למצב שבו אנחנו רוצים לדעת האם הקובץ הזה למשל קיים.
אז בואו נעשה עוד מתודה, does myfile exist, זה יהיה הרעיון פה, ובואו נעשה static function, יודעים מה? אנחנו רוצים הרי לחסוך פה, אז בואו נעתיק את זה.
נקרא לה file exist פשוט, היא לא צריכה לקבל תוכן, אבל היא כן צריכה לקבל נתיב, נכון? אז זה ה-file name הזה. עכשיו מתודה עלולה לזרוק שגיאה, והיא מתודה.
מה שכן, אנחנו רוצים להחזיר פה בוליאני. אוקיי, אז draws, ואז אנחנו רוצים לכתוב את ה-return type, נחזיר בוליאן, ואנחנו שוב פעם משתמשים ב-file manager אחרי שאנחנו מוצאים את ה-url.
אז let url, בוא נעשה את הקריאה למתודה מלמעלה, אז אני מעתיק את זה מפה. זה הנתיב לקובץ, הקשה להשגה.
עכשיו האם הקובץ קיים, אנחנו פשוט שואלים את הפייל מנאג'ר אז let file exists שווה FM נקודה האם הקובץ שלי קיים והוא שואל אותי או מה הנתיב אז בואו ניתן לו את הנתיב נכון זה הכי קל אז יש לי את הפייל url ולפייל url כמו שאתם יכולים לראות יש לו את הנתיב של הקובץ כסטריק וזה מה שאנחנו רוצים להחזיר יותר האם הקובץ
שלנו קיים מעולה אז יש לי פה מתודה סטטית שמחזירה לי בוליאנית הוא הפולס האם קובץ עם שם מסוים כבר קיים או לא אתם גם רוצים לדעת לקרוא מקובץ נכון? סתם הקדמתי פה עם ה-does my file exist. תכלס, מה שאתם רוצים לעשות זה לקרוא מהקובץ.
אז בואו נעשה את המתודה הבאה read from file. שוב פעם, אנחנו נעתיק פה את כל הדברים הטובים האלה. אז בואו נעתיק את כל המתודה הפעם.
נקרא לה read from file. מתודה כזאת צריכה לא להחזיר בוליאני אלא היא צריכה להחזיר את התוכן כסטרינג. ונסגור את המתודה. אנחנו תמיד תמיד רוצים להתחיל בלבקש את ה-url אז let url שווה וכן הלאה.
ו-once יש לנו את ה-file.url אז אנחנו רוצים פשוט לקרוא ממנו. אנחנו נרצה לעשות let resalt או let read, let resalt שווה בואו ננסה לקרוא יש בנאי למחלקה סטרינג שנקרא contents of url ואנחנו תכף נמצא אותו עכשיו בגלל שזה טרואוס אז יש