ระบบไฟล์ส่วนตัวต้นทางให้สิทธิ์เข้าถึงไฟล์ชนิดพิเศษที่ได้รับการเพิ่มประสิทธิภาพอย่างสูง เช่น ให้สิทธิ์เข้าถึงการเขียนเนื้อหาไฟล์แบบเฉพาะตัวและในตัว นักพัฒนาแอปจะเข้าถึงไฟล์ดังกล่าวได้โดยเรียกใช้ createSyncAccessHandle()
ซึ่งเป็นเมธอดที่เปิดเผยในออบเจ็กต์ FileSystemFileHandle
การโทรนี้จะส่งผลให้เกิด FileSystemSyncAccessHandle
FileSystemSyncAccessHandle
เป็นไฟล์พื้นฐานที่ให้สิทธิ์เข้าถึงไฟล์ในเครื่องได้อย่างมีประสิทธิภาพ กรณีการใช้งานหลักอย่างหนึ่งคือแอปพลิเคชันที่พอร์ตโค้ด C/C++ ไปยัง Wasm แต่ Wasm ยังไม่รองรับการเรียกใช้แบบไม่พร้อมกันอย่างสมบูรณ์ และการใช้ไลบรารี Asyncify เป็นทางเลือกมีประสิทธิภาพลดลงอย่างมาก ทำให้เมธอดทั้งหมดของ FileSystemSyncAccessHandle
แบบซิงโครนัสนั้นตรงกับแอปพลิเคชันที่ใช้ไฟล์แบบ POSIX แบบ POSIX แบบซิงโครนัส ซึ่งช่วยให้ API ทำงานสอดคล้องกับสรีรศาสตร์มากขึ้นในขณะที่เพิ่มประสิทธิภาพได้อย่างมาก
มีอะไรใหม่
FileSystemSyncAccessHandle
จะแสดงเมธอดต่อไปนี้ซึ่งเคยใช้เป็นแบบอะซิงโครนัส แต่เป็นแบบซิงโครนัสของ Chromium 108
truncate(newSize)
: ปรับขนาดไฟล์ที่เชื่อมโยงกับแฮนเดิลการเข้าถึงให้ยาวnewSize
ไบต์ หากnewSize
มีขนาดใหญ่กว่าขนาดไฟล์ปัจจุบัน ระบบจะเลื่อนไฟล์ให้มีไบต์ว่าง/ไม่ว่าง มิเช่นนั้นจะตัดไฟล์ให้สั้นลงgetSize()
: แสดงผลขนาดไฟล์ที่เชื่อมโยงกับแฮนเดิลการเข้าถึงในหน่วยไบต์flush()
: ตรวจสอบว่าเนื้อหาของไฟล์ที่เชื่อมโยงกับแฮนเดิลการเข้าถึงมีการแก้ไขทั้งหมดที่ดำเนินการผ่านwrite()
close()
: ล้างแฮนเดิลการเข้าถึงแล้วปิด การปิดที่จับการเข้าถึงจะปิดใช้การทำงานอื่นๆ บนนั้นและปล่อยล็อกของรายการที่เชื่อมโยงกับแฮนเดิลการเข้าถึง
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);
// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();
สิ่งที่ต้องทำ
โปรดทราบว่าการเปลี่ยนวิธีการจากอะซิงโครนัสเป็นแบบซิงโครนัสเป็นการเปลี่ยนแปลงที่ออนไลน์และมีโอกาสเสียหาย ไม่สามารถใช้ await
ในเมธอดแบบซิงโครนัสได้ แต่การใช้ Promise.then()
จะใช้งานไม่ได้
หากคุณเชื่อมโยงการเรียกใช้ then()
ตามผลลัพธ์ของเมธอดอะซิงโครนัสทั้งก่อนหน้านี้และในตอนนี้ คุณจะต้องเปลี่ยนโค้ด
// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */
ลิงก์ที่เกี่ยวข้อง
- ตรวจสอบแท็ก
- ข้อกำหนด
- ปัญหาเกี่ยวกับข้อกําหนด (ซึ่งนำไปสู่การเปลี่ยนแปลง)
- รายการ ChromeStatus
- ข้อบกพร่องของ Chromium