ไดเรกทอรีเอกสารของแอปพลิเคชันเป็นพื้นที่จัดเก็บถาวรสำหรับไฟล์ผู้ใช้ที่ต้องคงอยู่ระหว่างเซสชันและสามารถกู้คืนจากการสำรองข้อมูลได้ ตาม Apple File System Programming Guide, 2026 บน iOS ไดเรกทอรี Documents จะถูกรวมอยู่ในการสำรองข้อมูล iCloud โดยอัตโนมัติ ซึ่งแตกต่างจากแคชและไดเรกทอรีชั่วคราว การใช้ ไดเรกทอรีเอกสาร อย่างถูกต้องรับประกันว่าไฟล์ผู้ใช้จะไม่สูญหายระหว่างการอัปเดตหรือติดตั้งแอปใหม่
ประเด็นสำคัญ
context.filesDir พร้อมการจัดการสำรองข้อมูลด้วยตนเองไดเรกทอรีเอกสาร เป็นพื้นที่จัดเก็บเฉพาะภายในแซนด์บ็อกซ์ของแอปพลิเคชัน ที่ออกแบบมาสำหรับการจัดเก็บไฟล์ผู้ใช้แบบถาวร ซึ่งแตกต่างจากแคช ไฟล์ในไดเรกทอรีนี้ถือว่ามีความสำคัญต่อผู้ใช้: ระบบจะไม่ลบเมื่อพื้นที่ไม่เพียงพอ ถูกเก็บรักษาไว้ระหว่างการอัปเดตแอป และสำรองข้อมูลระหว่างการซิงโครไนซ์อุปกรณ์ บน iOS ไดเรกทอรี Documents เป็นส่วนหนึ่งของคอนเทนเนอร์ Sandbox และถูกรวมอยู่ในการสำรองข้อมูล iCloud โดยอัตโนมัติ บน Android ไม่มีสิ่งที่เทียบเท่าโดยตรง — สิ่งที่เทียบเท่าคือ context.filesDir ซึ่งมีไว้สำหรับไฟล์ถาวรเช่นกัน แต่ไม่มีกลไกการสำรองข้อมูลในตัว
ความแตกต่างระหว่าง ไดเรกทอรีเอกสาร และพื้นที่จัดเก็บภายในบน Android นั้นน้อยมาก: ทั้งสองอยู่ในแซนด์บ็อกซ์ของแอป ทั้งสองถูกลบเมื่อถอนการติดตั้ง ทั้งสองไม่สามารถเข้าถึงได้โดยแอปอื่น ความแตกต่างหลักคือเชิงความหมาย: ไดเรกทอรีเอกสารถือว่าไฟล์ถูกสร้างขึ้นหรือนำเข้าโดยผู้ใช้ ในขณะที่พื้นที่จัดเก็บภายในอาจมีไฟล์ภายในของแอป (ฐานข้อมูล การกำหนดค่า) บน iOS ความแตกต่างมีมากกว่า: Documents ถูกสำรองข้อมูลโดยอัตโนมัติ ในขณะที่ Library/Application Support ไม่ถูกสำรอง ซึ่งส่งผลต่อกลยุทธ์การจัดเก็บ: ใส่เฉพาะสิ่งที่ผู้ใช้ต้องการกู้คืนบนอุปกรณ์ใหม่ใน Documents และใส่ข้อมูลภายในที่แอปสามารถสร้างใหม่ได้ใน Application Support
สถาปัตยกรรมแซนด์บ็อกซ์รับประกันว่าแอปพลิเคชันอื่นไม่สามารถเข้าถึงไดเรกทอรีเอกสารของแอปของคุณได้ บน iOS การเข้าถึง Documents ของแอปอื่นเป็นไปไม่ได้หากไม่มีเจลเบรค บน Android การเข้าถึงรูทอนุญาตให้อ่าน filesDir ของแอปใดๆ ดังนั้นข้อมูลที่ละเอียดอ่อน (โทเคน คีย์การเข้ารหัส) ต้องได้รับการปกป้องเพิ่มเติมโดยใช้ EncryptedSharedPreferences หรือ EncryptedFile จากไลบรารี AndroidX Security
ไดเรกทอรีเอกสารควรจัดเก็บข้อมูลที่มีค่าสำหรับผู้ใช้และควรเข้าถึงได้หลังจากเริ่มต้นแอปใหม่หรือกู้คืนอุปกรณ์ ไม่ใช่ทุกไฟล์ที่เหมาะสมสำหรับการจัดเก็บในไดเรกทอรีนี้ — การเลือกขึ้นอยู่กับประเภทข้อมูลและสถานการณ์การใช้งาน
ไฟล์ผู้ใช้เป็นเนื้อหาหลักของไดเรกทอรีเอกสาร สิ่งเหล่านี้อาจเป็นเอกสารข้อความที่สร้างในโปรแกรมแก้ไข รูปภาพที่ถ่ายด้วยกล้องของแอป รายงาน PDF ที่ส่งออก การบันทึกเสียง โน้ต ไฟล์แต่ละไฟล์ดังกล่าวถูกสร้างขึ้นโดยผู้ใช้หรือตามคำขอของพวกเขาและต้องเข้าถึงได้ตลอดเวลา บน iOS ไฟล์จาก Documents จะแสดงในแอป Files ของระบบ ทำให้ผู้ใช้สามารถจัดการผ่านตัวจัดการไฟล์มาตรฐาน บน Android ไม่มีการแสดงผลที่คล้ายคลึงกัน — แอปต้องจัดเตรียมอินเทอร์เฟซสำหรับดูไฟล์ที่บันทึกไว้ด้วยตนเอง
ฐานข้อมูล SQLite และไฟล์การตั้งค่ามักจะถูกจัดเก็บไว้ใกล้กับไดเรกทอรีเอกสาร แต่ไม่อยู่ภายในนั้น บน iOS ฐานข้อมูลจะถูกวางใน Library/Application Support เนื่องจากไม่ควรปรากฏในแอป Files และสำรองแยกต่างหาก บน Android ฐานข้อมูลจะถูกสร้างขึ้นโดยค่าเริ่มต้นใน /data/data/<package>/databases/ ผ่าน Room หรือ SQLiteOpenHelper หากฐานข้อมูลมีเนื้อหาผู้ใช้ (โน้ต ไดอารี่ บันทึกทางการเงิน) สามารถวางใน filesDir เพื่อรับประกันการสำรองข้อมูลของระบบ Room อนุญาตให้ระบุไดเรกทอรีจัดเก็บแบบกำหนดเองสำหรับฐานข้อมูลผ่าน callback ของ RoomDatabase.Builder
val dbFile = File(context.filesDir, "user_database.db")
val db = Room.databaseBuilder<AppDatabase>(
context,
dbFile.absolutePath
).build()
ไฟล์ที่ผู้ใช้นำเข้าจากแอปอื่นหรือส่งออกจากแอปของคุณควรถูกบันทึกในไดเรกทอรีเอกสารด้วย บน iOS การนำเข้าผ่าน UIDocumentPickerViewController จะวางสำเนาของไฟล์ใน Documents โดยอัตโนมัติเมื่อใช้พารามิเตอร์ asCopy: true บน Android การนำเข้าผ่านกล่องโต้ตอบ SAF ก็สร้างสำเนาของไฟล์ในแซนด์บ็อกซ์ของแอปเช่นกัน เมื่อส่งออกข้อมูล (เช่น การสร้างไฟล์ CSV ที่มีรายชื่อติดต่อ) ให้บันทึกไฟล์ใน Documents/filesDir ก่อน จากนั้นเสนอให้ผู้ใช้แชร์ผ่าน Share Sheet ซึ่งรับประกันว่าแม้ว่าผู้ใช้จะลืมบันทึกไฟล์หลังจากส่ง สำเนาจะยังคงอยู่ในแอปสำหรับการใช้ในภายหลัง
บน Android ฟังก์ชันของไดเรกทอรีเอกสาร ดำเนินการโดย context.filesDir นอกจากนี้ ยังมีไดเรกทอรี context.externalFilesDir บนการ์ด SD แต่ไม่รับประกันความสมบูรณ์ของข้อมูล มาดูเทคนิคหลักในการทำงานกับไดเรกทอรีเหล่านี้กัน
filesDir เป็นไดเรกทอรีหลักสำหรับไฟล์ถาวรของแอปบน Android ตั้งอยู่ในแซนด์บ็อกซ์ของแอปและถูกลบทั้งหมดเมื่อถอนการติดตั้ง เพื่อรับอินสแตนซ์ File ให้ใช้ context.filesDir ซึ่งส่งกลับพาธไปยัง /data/data/<package>/files/ ในการสร้างและอ่านไฟล์ ให้ใช้การดำเนินการ File มาตรฐานของ Java/Kotlin หรือเมธอด Context openFileInput() และ openFileOutput() ซึ่งรับชื่อไฟล์และส่งกลับ FileInputStream/FileOutputStream เมธอด openFileOutput() จะสร้างไฟล์ใน filesDir โดยอัตโนมัติหากยังไม่มีอยู่ และอนุญาตให้ระบุโหมดการเข้าถึง: MODE_PRIVATE (เฉพาะแอปปัจจุบัน), MODE_APPEND (ต่อท้าย) หรือ MODE_WORLD_READABLE (เลิกใช้แล้ว ไม่ใช้ตั้งแต่ API 24+)
val fileName = "report.pdf"
val content = "PDF content".toByteArray()
context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream ->
stream.write(content)
}
val bytes = context.openFileInput(fileName).use { stream ->
stream.readBytes()
}
บน Android 10+ โมเดล Scoped Storage ไม่มีผลต่อ filesDir — การเข้าถึงแซนด์บ็อกซ์ของแอปเองอย่างเต็มที่ยังคงอยู่ การดำเนินการอ่านและเขียนทั้งหมดภายใน filesDir ไม่ต้องการสิทธิ์เพิ่มเติม อย่างไรก็ตาม หากคุณพยายามเข้าถึงไฟล์ของแอปอื่นผ่าน filesDir คุณจะได้รับข้อยกเว้น ในการแชร์ไฟล์ ให้ใช้ FileProvider ซึ่งสร้าง URI เนื้อหาชั่วคราวเพื่อถ่ายโอนไฟล์ไปยังแอปอื่น FileProvider ถูกประกาศใน AndroidManifest.xml ผ่านแท็ก <provider> และกำหนดค่าในไฟล์ XML เส้นทาง นี่เป็นกลไกมาตรฐานสำหรับการถ่ายโอนไฟล์ระหว่างแอป ใช้ตัวอย่างเช่นเมื่อส่งรูปภาพผ่าน Intent ด้วย ACTION_SEND
บน iOS Documents Directory เป็นส่วนหนึ่งของคอนเทนเนอร์ Sandbox ของแอปที่มีสถานะพิเศษ ไฟล์จากไดเรกทอรีนี้จะถูกรวมอยู่ในการสำรองข้อมูล iCloud โดยอัตโนมัติ แสดงในแอป Files และถูกเก็บรักษาไว้ระหว่างการอัปเดตแอปผ่าน App Store
การสำรองข้อมูลอัตโนมัติ ของ Documents เป็นข้อได้เปรียบสำคัญของ iOS เมื่อผู้ใช้เชื่อมต่ออุปกรณ์กับ iTunes หรือเปิดใช้งาน iCloud Backup ไฟล์ทั้งหมดจาก Documents/ จะถูกคัดลอกไปยังการสำรองข้อมูล เมื่อกู้คืนบนอุปกรณ์ใหม่ ผู้ใช้จะได้รับไฟล์ทั้งหมดโดยไม่ต้องดำเนินการเพิ่มเติม อย่างไรก็ตาม ข้อได้เปรียบนี้จะกลายเป็นข้อเสียหากแอปจัดเก็บข้อมูลจำนวนมากใน Documents: เวลาสำรองข้อมูลเพิ่มขึ้นและพื้นที่จัดเก็บ iCloud อาจหมดอย่างรวดเร็ว ดังนั้น Documents ควรจัดเก็บเฉพาะไฟล์ที่ผู้ใช้ต้องการจริงๆ ระหว่างการกู้คืน ไฟล์ชั่วคราว แคช และข้อมูลที่สร้างใหม่ได้ควรอยู่ใน Caches หรือ Library/Application Support Apple แนะนำให้แยกไฟล์ที่สามารถดาวน์โหลดซ้ำจากอินเทอร์เน็ตออกจากการสำรองข้อมูล ผ่านแอตทริบิวต์ isExcludedFromBackup
let fm = FileManager.default
let docsURL = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docsURL.appendingPathComponent("notes.txt")
let text = "เนื้อหาโน้ต"
try text.write(to: fileURL, atomically: true, encoding: .utf8)
iCloud Drive อนุญาตให้ซิงโครไนซ์ไฟล์จาก Documents ระหว่างอุปกรณ์ของผู้ใช้คนเดียวกัน ในการเปิดใช้งานการซิงโครไนซ์ แอปควรใช้ API NSDocument หรือ UIDocument ซึ่งจัดการการกำหนดเวอร์ชันและการแก้ไขข้อขัดแย้งโดยอัตโนมัติ วิธีทางเลือกคือการใช้ iCloud กับ CloudKit ซึ่งให้การควบคุมการซิงโครไนซ์ที่ยืดหยุ่นมากขึ้น แต่ต้องกำหนดค่าบน CloudKit Dashboard เมื่อใช้ iCloud Drive ตรวจสอบให้แน่ใจว่าคุณจัดการข้อขัดแย้งในการแก้ไขอย่างถูกต้อง (รวมหรือผู้เขียนคนสุดท้ายชนะ) และแจ้งให้ผู้ใช้ทราบเกี่ยวกับสถานะการซิงโครไนซ์ผ่านอินเทอร์เฟซของแอป iCloud ไม่รับประกันการซิงโครไนซ์ทันที — ความล่าช้าอาจอยู่ในช่วงตั้งแต่ไม่กี่วินาทีไปจนถึงหลายนาที ขึ้นอยู่กับขนาดไฟล์และคุณภาพการเชื่อมต่อ สำหรับข้อมูลที่สำคัญ ให้ใช้การเขียนแบบธุรกรรมและการกำหนดเวอร์ชันเพื่อให้ในกรณีที่มีข้อขัดแย้ง สามารถกู้คืนเวอร์ชันก่อนหน้าของไฟล์ได้
การเลือกที่ถูกต้อง ระหว่าง Documents Directory และ Cache Directory กำหนดความน่าเชื่อถือของการจัดเก็บข้อมูลผู้ใช้ ข้อผิดพลาดในการเลือกนำไปสู่การสูญเสียข้อมูล (หากไฟล์สำคัญถูกจัดเก็บในแคช) หรือการล้นของการสำรองข้อมูล (หากไฟล์ชั่วคราวถูกจัดเก็บใน Documents)
| เกณฑ์ | Documents Directory | Cache Directory |
|---|---|---|
| การรับประกันความสมบูรณ์ของข้อมูล | สูง — ไม่ถูกลบโดยระบบ | ต่ำ — อาจถูกล้าง |
| การสำรองข้อมูล (iOS) | อัตโนมัติใน iCloud | ไม่ถูกสำรอง |
| การมองเห็นของผู้ใช้ (iOS) | ในแอป Files | ซ่อนอยู่ |
| การล้างเมื่ออัปเดต | ไม่ถูกล้าง | อาจถูกล้าง |
| ขนาดที่แนะนำ | เท่าใดก็ได้ แต่ควบคุมผ่านการตั้งค่า | สูงสุด 100–200 MB |
| ประเภทข้อมูล | ไฟล์ผู้ใช้ | ข้อมูลชั่วคราวที่สร้างใหม่ได้ |
แนวปฏิบัติที่ดีที่สุด สำหรับการใช้ไดเรกทอรีเอกสารรวมถึงกฎสำคัญหลายข้อ ประการแรก ขอยืนยันจากผู้ใช้ก่อนลบไฟล์จากไดเรกทอรีนี้เสมอ ซึ่งแตกต่างจากแคช การลบเอกสารอาจนำไปสู่การสูญเสียเนื้อหาผู้ใช้อย่างถาวร ประการที่สอง ใช้การกำหนดเวอร์ชันไฟล์: เมื่อเขียนทับไฟล์ที่มีอยู่ ให้บันทึกเวอร์ชันก่อนหน้าด้วยคำต่อท้าย _backup หรือใช้กลไก Snapshot ประการที่สาม จัดเตรียมอินเทอร์เฟซให้ผู้ใช้สำหรับดู เปลี่ยนชื่อ ลบ และส่งออกไฟล์จากไดเรกทอรีเอกสาร บน iOS ไฟล์จาก Documents จะแสดงใน Files โดยอัตโนมัติ บน Android คุณต้องใช้ตัวจัดการไฟล์ของคุณเองหรือใช้ไลบรารีของบุคคลที่สาม
ให้ความสนใจเป็นพิเศษกับการโยกย้ายข้อมูลระหว่างการอัปเดตแอป หากเวอร์ชันใหม่เปลี่ยนโครงสร้างการจัดเก็บไฟล์ (เช่น ย้ายข้อมูลจากไดเรกทอรีย่อยหนึ่งไปยังอีกไดเรกทอรีหนึ่ง หรือเปลี่ยนรูปแบบไฟล์) ให้ใช้การโยกย้ายครั้งเดียวในการเริ่มต้นครั้งแรกหลังการอัปเดต เก็บหมายเลขเวอร์ชันสคีมาข้อมูลใน SharedPreferences และเรียกใช้การโยกย้ายหากไม่ตรงกัน อย่าลบไฟล์เก่าก่อนการโยกย้ายเสร็จสิ้น — ในกรณีที่ล้มเหลว ผู้ใช้ไม่ควรสูญเสียข้อมูล หากการโยกย้ายรวมถึงการแปลงรูปแบบ (เช่น การเปลี่ยนจาก JSON เป็น SQLite) ให้บันทึกไฟล์ต้นฉบับเป็นข้อมูลสำรองในไดเรกทอรีแยกต่างหากพร้อมวันที่โยกย้าย ผู้ใช้ควรสามารถยกเลิกการเปลี่ยนแปลงผ่านการตั้งค่าแอปภายใน 30 วันแรกหลังการอัปเดต ตามที่ Apple Human Interface Guidelines แนะนำ
คำถามที่พบบ่อย
Documents จะแสดงในแอป Files และสำรองข้อมูลไปยัง iCloud โดยอัตโนมัติ Application Support จะไม่แสดงใน Files และไม่ถูกสำรองโดยค่าเริ่มต้น เลือก Application Support สำหรับข้อมูลภายในของแอปที่คุณไม่จำเป็นต้องแสดงให้ผู้ใช้เห็น
ใช่ เมื่อลบบัญชี ให้เสนอให้ผู้ใช้ล้างไฟล์ภายในเครื่องทั้งหมดที่เกี่ยวข้องกับบัญชีนั้น แสดงกล่องโต้ตอบที่ถาม “ลบข้อมูลภายในเครื่องทั้งหมด?” และระบุว่าไฟล์ใดจะได้รับผลกระทบ นี่เป็นข้อกำหนดของ GDPR และการปฏิบัติตามนโยบายของ App Store และ Google Play
บน iOS เพียงกู้คืนอุปกรณ์จากการสำรองข้อมูล iCloud หรือ iTunes — ไฟล์จาก Documents จะถูกกู้คืนโดยอัตโนมัติ บน Android ให้ใช้ Google Drive Backup API เพื่อสำรองไฟล์จาก filesDir หรือใช้การส่งออกผ่านบริการคลาวด์
บน iOS ผู้ใช้สามารถลบไฟล์ผ่านแอป Files บน Android การลบทำได้ผ่านอินเทอร์เฟซของแอปของคุณเท่านั้น ขอแนะนำให้ใช้ถังขยะเอกสารที่มีความสามารถในการกู้คืนภายใน 30 วันหลังจากการลบเพื่อป้องกันการสูญเสียข้อมูลโดยไม่ตั้งใจ
ไม่จำเป็นต้องดำเนินการเพิ่มเติม — iOS และ Android จะเก็บรักษาไดเรกทอรีเอกสารโดยอัตโนมัติระหว่างการอัปเดตผ่าน App Store หรือ Google Play อย่างไรก็ตาม เมื่อเปลี่ยนโครงสร้างการจัดเก็บ ให้ใช้การโยกย้ายข้อมูลในการเริ่มต้นครั้งแรกของเวอร์ชันใหม่โดยตรวจสอบหมายเลขเวอร์ชันสคีมาในการตั้งค่า
สรุป
context.filesDir เป็นสิ่งที่เทียบเท่า — ไฟล์ถูกเก็บรักษาระหว่างการอัปเดตแต่ไม่มีกลไกสำรองข้อมูลในตัวเราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม