File System Access API ו-Origin Private File System API מאפשרים למפתחים לגשת לקבצים ולספריות במכשיר של המשתמש. האפשרות הראשונה מאפשרת למפתחים לקרוא ולכתוב במערכת הקבצים הרגילה שגלויה למשתמשים, והאפשרות השנייה פותחת מערכת קבצים מיוחדת ומוסתרת מהמשתמשים, שהיא פרטית למקור של כל אתר ומגיעה עם יתרונות ביצועים מסוימים. הדרך שבה המפתחים מקיימים אינטראקציה עם קבצים וספריות בשני המקרים היא באמצעות אובייקטים מסוג FileSystemHandle
. באופן ספציפי יותר, FileSystemFileHandle
לקבצים ו-FileSystemDirectoryHandle
לספריות. עד עכשיו, כדי לקבל הודעה על שינויים בקובץ או בספרייה באחת ממערכות הקבצים, היה צורך לבצע סקר כלשהו ולהשוות את חותמת הזמן lastModified
או אפילו את תוכן הקובץ עצמו.
ה-File System Observer API, בגרסת המקור לניסיון מ-Chrome 129, משנה את המצב הזה ומאפשר למפתחים לקבל התראות באופן אוטומטי כשמתרחשים שינויים. במדריך הזה נסביר איך התכונה פועלת ואיך אפשר לנסות אותה.
תרחישים לדוגמה
משתמשים ב-File System Observer API באפליקציות שצריכות לקבל הודעה על שינויים אפשריים במערכת הקבצים ברגע שהם מתרחשים.
- סביבות פיתוח משולבות (IDE) מבוססות-אינטרנט שמוצג בהן ייצוג של עץ מערכת הקבצים של הפרויקט.
- אפליקציות שמסנכרנות שינויים במערכת הקבצים עם שרת. לדוגמה, קובץ מסד נתונים של SQLite.
- אפליקציות שצריכות להודיע ל-thread הראשי על שינויים במערכת הקבצים מעובד או מכרטיסייה אחרת.
- אפליקציות שמנטרות ספרייה של משאבים, למשל כדי לבצע אופטימיזציה של תמונות באופן אוטומטי.
- חוויות שמפיקות תועלת מהטעינה מחדש בזמן אמת, כמו חבילות שקופיות מבוססות-HTML שבהן הטעינה מחדש מופעלת על ידי שינוי בקובץ.
איך משתמשים ב-File System Observer API
זיהוי תכונות
כדי לבדוק אם יש תמיכה ב-File System Observer API, מריצים בדיקת תכונה כמו בדוגמה הבאה.
if ('FileSystemObserver' in self) {
// The File System Observer API is supported.
}
איך מפעילים משגיח על מערכת קבצים
כדי לאתחל משתמש מעקב אחר מערכת קבצים, קוראים לפונקציה new FileSystemObserver()
ומספקים לה פונקציית callback
כארגומנט.
const observer = new FileSystemObserver(callback);
התחלת מעקב אחרי קובץ או ספרייה
כדי להתחיל לעקוב אחרי קובץ או ספרייה, צריך להפעיל את השיטה האסינכרונית observe()
של המופע FileSystemObserver
. מעבירים לארגומנט של השיטה את FileSystemHandle
של הקובץ או הספרייה שנבחרו. כשמשגיחים על ספרייה, יש ארגומנטים אופציונליים של options
שמאפשרים לכם לבחור אם תרצו לקבל עדכונים על שינויים בספרייה באופן רספונסיבי (כלומר, בספרייה עצמה ובכל הספריות המשניות והקבצים שבתוכה). כברירת מחדל, המערכת תצפה רק בספרייה עצמה ובקבצים שמכילים אותה באופן ישיר.
// Observe a file.
await observer.observe(fileHandle);
// Observe a directory.
await observer.observe(directoryHandle);
// Observe a directory recursively.
await observer.observe(directoryHandle, {recursive: true});
פונקציית הקריאה החוזרת
כשמתרחשים שינויים במערכת הקבצים, מתבצעת קריאה לפונקציית קריאה חוזרת עם השינוי במערכת הקבצים records
ועם observer
עצמו כארגומנטים שלה. אפשר להשתמש בארגומנט observer
, למשל, כדי לנתק את הצופה (ראו הפסקת המעקב אחרי מערכת הקבצים) כשכל הקבצים שמעניינים אתכם נמחקים.
const callback = (records, observer) => {
for (const record of records) {
console.log('Change detected', record);
}
};
הרשומה של שינוי מערכת הקבצים
לכל רשומת שינוי במערכת הקבצים יש את המבנה הבא. כל השדות מוגדרים לקריאה בלבד.
root
(FileSystemHandle
): ה-handle שהוענק לפונקציהFileSystemObserver.observe()
.changedHandle
(FileSystemHandle
): ה-handle שמושפע מהשינוי במערכת הקבצים. השדה הזה יהיהnull
באירועים מסוג"errored"
,"unknown"
ו-"disappeared"
. כדי לראות איזה קובץ או ספרייה נעלמו, משתמשים ב-relativePathComponents
.relativePathComponents
(Array
): הנתיב שלchangedHandle
ביחס ל-root
.type
(aString
): סוג השינוי. אלה הסוגים האפשריים:"appeared"
: הקובץ או הספרייה נוצרו או הועברו ל-root
."disappeared"
: הקובץ או הספרייה נמחקו או הועברו מ-root
."modified"
: הקובץ או הספרייה שונו."moved"
: הקובץ או הספרייה הועברו בתוךroot
."unknown"
: המשמעות היא שהתרחשו אפס אירועים או יותר שלא תועדו. בתגובה לכך, המפתחים צריכים לבצע סקירה של הספרייה שנמצאת במעקב."errored"
: התצפית כבר לא תקפה. במקרה כזה, מומלץ להפסיק את המעקב אחרי מערכת הקבצים. הערך הזה יישלח גם כשמגיעים למגבלה המקסימלית של תצפיות לכל מקור. המגבלה הזו תלויה במערכת ההפעלה ולא ידועה מראש. במקרה כזה, האתר עשוי לנסות שוב, אבל אין ערובה לכך שמערכת ההפעלה פינתה מספיק משאבים. הערך הזה נשלח גם כשהמזהה שנצפה (כלומר, שורש התצפית) נמחק או מועבר. במקרה כזה, קודם נשלח האירוע"disappeared"
ואחריו האירוע"errored"
, שמציין שהתצפית כבר לא תקפה. לבסוף, האירוע הזה נשלח כשהרשאה לספרייה או למנהל הקבצים מוסרת.
relativePathMovedFrom
(Array
, אופציונלי): המיקום הקודם של הכינוי שהועתק. האפשרות הזו זמינה רק כשהערך שלtype
הוא"moved"
.
הפסקת מעקב אחרי קובץ או ספרייה
כדי להפסיק את המעקב אחרי FileSystemHandle
, קוראים ל-method unobserve()
ומעבירים לו את ה-handle כארגומנט.
observer.unobserve(fileHandle);
הפסקת המעקב אחרי מערכת הקבצים
כדי להפסיק את המעקב אחרי מערכת הקבצים, מנתקים את המכונה FileSystemObserver
באופן הבא.
observer.disconnect();
התנסות ב-API
כדי לבדוק את File System Observer API באופן מקומי, מגדירים את הדגל #file-system-observer
בקובץ about:flags
. כדי לבדוק את ה-API עם משתמשים אמיתיים, נרשמים לגרסת המקור לניסיון ופועלים לפי ההוראות במדריך גרסת המקור לניסיון ב-Chrome. גרסת המקור לניסיון תפעל מ-Chrome 129 (11 בספטמבר 2024) עד Chrome 134 (26 בפברואר 2025).
הדגמה (דמו)
אתם יכולים לראות את File System Observer API בפעולה בדמו המוטמע. אפשר לעיין בקוד המקור או ליצור רמיקס של קוד הדגמה ב-Glitch. הדגמה יוצרת, מוחקת או משחזרת באופן אקראי קבצים בספרייה שנמצאת במעקב, ומתעדת את הפעילות שלה בחלק העליון של חלון האפליקציה. לאחר מכן, השינויים מתועדים ביומן בחלק התחתון של חלון האפליקציה. אם אתם קוראים את המאמר הזה בדפדפן שלא תומך ב-File System Observer API, תוכלו לעיין בצילום מסך של הדמו.
משוב
אם יש לכם משוב לגבי הצורה של File System Observer API, תוכלו לכתוב תגובה בבעיה מס' 123 במאגר WHATWG/fs.
קישורים רלוונטיים
- הסבר
- בדיקת התג
- העמדה של Mozilla בנושא תקנים
- העמדה של WebKit בנושא סטנדרטים
- ChromeStatus
- באג ב-Chromium
תודות
המסמך הזה נבדק על ידי Daseul Lee, Nathan Memmott, Etienne Noël ו-Rachel Andrew.