MFC - ระบบไฟล์
ในบทนี้เราจะกล่าวถึงส่วนประกอบต่างๆของระบบไฟล์
ไดรฟ์
ก driveเป็นอุปกรณ์ทางกายภาพที่เชื่อมต่อกับคอมพิวเตอร์เพื่อให้สามารถจัดเก็บข้อมูลได้ โลจิคัลดิสก์โลจิคัลวอลุ่มหรือดิสก์เสมือน (VD หรือ vdisk สำหรับตัวย่อ) คืออุปกรณ์เสมือนที่จัดเตรียมพื้นที่ความจุของหน่วยเก็บข้อมูลที่ใช้งานได้บนฟิสิคัลดิสก์ไดร์ฟอย่างน้อยหนึ่งตัวในระบบคอมพิวเตอร์ ไดรฟ์อาจเป็นฮาร์ดดิสก์ซีดีรอมดีวีดีรอมแฟลชไดรฟ์ (USB) การ์ดหน่วยความจำ ฯลฯ
การดำเนินการหลักอย่างหนึ่งที่คุณต้องทำคือการรับรายชื่อไดรฟ์ในคอมพิวเตอร์
ให้เราดูเป็นตัวอย่างง่ายๆโดยการสร้างแอปพลิเคชันที่ใช้กล่องโต้ตอบ MFC ใหม่
Step 1 - ลากปุ่มเดียวจากกล่องเครื่องมือเปลี่ยนคำบรรยายเพื่อรับข้อมูลไดรฟ์
Step 2 - ลบคำอธิบายภาพของการควบคุมแบบคงที่ (บรรทัดสิ่งที่ต้องทำ) และเปลี่ยน ID เป็น IDC_STATIC_TEXT

Step 3 - คลิกขวาที่ปุ่มแล้วเลือกเพิ่มตัวจัดการเหตุการณ์

Step 4 - เลือกประเภทข้อความ BN_CLICKED แล้วคลิกปุ่มเพิ่มและแก้ไข
Step 5 - เพิ่มตัวแปรค่า m_strDrives สำหรับการควบคุม Static Text

เพื่อรองรับไดรฟ์บนคอมพิวเตอร์ไลบรารี Win32 มีฟังก์ชัน GetLogicalDrives () ของ Microsoft Window ซึ่งจะดึงข้อมูลรายการไดรฟ์ทั้งหมดบนคอมพิวเตอร์ปัจจุบัน
Step 6 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้

Step 7 - เมื่อคุณคลิกปุ่มคุณจะเห็นไดรฟ์ทั้งหมดบนคอมพิวเตอร์ของคุณ

ไดเรกทอรี
ในการคำนวณก directoryเป็นโครงสร้างการลงรายการระบบไฟล์ซึ่งมีการอ้างอิงถึงไฟล์คอมพิวเตอร์อื่น ๆ และอาจเป็นไดเร็กทอรีอื่น ๆ ไดเร็กทอรีคือตำแหน่งทางกายภาพ สามารถรองรับการทำงานที่ไม่มีในไดรฟ์
ให้เราดูตัวอย่างง่ายๆโดยการสร้างแอปพลิเคชันที่ใช้กล่องโต้ตอบ MFC ใหม่
Step 1- ลากปุ่มสามปุ่มจากกล่องเครื่องมือ เปลี่ยนคำบรรยายเพื่อสร้างไดเรกทอรีลบไดเรกทอรีและย้ายไดเรกทอรี
Step 2 - เปลี่ยน ID ของปุ่มเหล่านี้เป็น IDC_BUTTON_CREATE, IDC_BUTTON_DELETE และ IDC_BUTTON_MOVE.
Step 3 - ลบบรรทัดสิ่งที่ต้องทำ

Step 4 - เพิ่มตัวจัดการเหตุการณ์สำหรับแต่ละปุ่ม
Step 5 - ในการสร้างไดเร็กทอรีคุณสามารถเรียกใช้เมธอด CreateDirectory () ของไลบรารี Win32
Step 6 - นี่คือการใช้งานตัวจัดการเหตุการณ์ปุ่มสร้างซึ่งเราจะสร้างหนึ่งไดเร็กทอรีและจากนั้นอีกสองไดเร็กทอรีย่อย
void CMFCDirectoriesDemoDlg::OnBnClickedButtonCreate() {
// TODO: Add your control notification handler code here
SECURITY_ATTRIBUTES saPermissions;
saPermissions.nLength = sizeof(SECURITY_ATTRIBUTES);
saPermissions.lpSecurityDescriptor = NULL;
saPermissions.bInheritHandle = TRUE;
if (CreateDirectory(L"D:\\MFCDirectoryDEMO", &saPermissions) == TRUE)
AfxMessageBox(L"The directory was created.");
CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir1", NULL);
CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir2", NULL);
}
Step 7 - ในการกำจัดไดเร็กทอรีคุณสามารถเรียกไฟล์ RemoveDirectory()ฟังก์ชันของไลบรารี Win32 นี่คือการใช้งานตัวจัดการเหตุการณ์ปุ่มลบ
void CMFCDirectoriesDemoDlg::OnBnClickedButtonDelete() {
// TODO: Add your control notification handler code here
if (RemoveDirectory(L"D:\\MFCDirectoryDEMO\\Dir1") == TRUE)
AfxMessageBox(L"The directory has been deleted");
}
Step 8- หากคุณต้องการย้ายไดเร็กทอรีคุณสามารถเรียกใช้ฟังก์ชัน MoveFile () เดียวกันได้ นี่คือการใช้งานตัวจัดการเหตุการณ์ปุ่มย้ายซึ่งเราจะสร้างไดเร็กทอรีใหม่แรกจากนั้นย้าย Dir2 ไปยังไดเร็กทอรีนั้น
void CMFCDirectoriesDemoDlg::OnBnClickedButtonMove() {
// TODO: Add your control notification handler code here
CreateDirectory(L"D:\\MFCDirectory", NULL);
if (MoveFile(L"D:\\MFCDirectoryDEMO\\Dir1", L"D:\\MFCDirectory\\Dir1") == TRUE)
AfxMessageBox(L"The directory has been moved");
}
Step 9 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้

Step 10 - เมื่อคุณคลิกปุ่ม Create Directory ระบบจะสร้างไดเรกทอรีเหล่านี้

Step 11 - เมื่อคุณคลิกที่ปุ่ม Delete Directory มันจะลบ Dir1

การประมวลผลไฟล์
ส่วนใหญ่ file processing ในแอปพลิเคชัน MFC จะดำเนินการร่วมกับคลาสที่มีชื่อว่า CArchive. คลาส CArchive ทำหน้าที่เป็นรีเลย์ระหว่างแอปพลิเคชันและสื่อที่ใช้ในการจัดเก็บข้อมูลหรือทำให้พร้อมใช้งาน ช่วยให้คุณสามารถบันทึกเครือข่ายที่ซับซ้อนของออบเจ็กต์ในรูปแบบไบนารีถาวร (โดยปกติจะเป็นที่เก็บดิสก์) ซึ่งจะคงอยู่หลังจากที่วัตถุเหล่านั้นถูกลบ
นี่คือรายการวิธีการในคลาส CArchive -
ซีเนียร์ | ชื่อและคำอธิบาย |
---|---|
1 | Abort ปิดที่เก็บถาวรโดยไม่มีข้อยกเว้น |
2 | Close ล้างข้อมูลที่ไม่ได้เขียนและตัดการเชื่อมต่อจากไฟล์ CFile. |
3 | Flush ล้างข้อมูลที่ไม่ได้เขียนออกจากบัฟเฟอร์ไฟล์เก็บถาวร |
4 | GetFile รับตัวชี้วัตถุ CFile สำหรับไฟล์เก็บถาวรนี้ |
5 | GetObjectSchema เรียกจาก Serialize ฟังก์ชันเพื่อกำหนดเวอร์ชันของอ็อบเจ็กต์ที่กำลังถูก deserialized |
6 | IsBufferEmpty ตรวจสอบว่าบัฟเฟอร์ถูกล้างในระหว่างกระบวนการรับ Windows Sockets หรือไม่ |
7 | IsLoading กำหนดว่ากำลังโหลดที่เก็บถาวรหรือไม่ |
8 | IsStoring กำหนดว่ากำลังจัดเก็บที่เก็บถาวรหรือไม่ |
9 | MapObject วางวัตถุในแผนที่ที่ไม่ได้ทำให้เป็นอนุกรมกับไฟล์ แต่มีให้สำหรับวัตถุย่อยที่จะอ้างอิง |
10 | Read อ่านไบต์ดิบ |
11 | ReadClass อ่านการอ้างอิงคลาสที่เก็บไว้ก่อนหน้านี้ด้วย WriteClass. |
12 | ReadObject เรียกใช้ฟังก์ชัน Serialize ของวัตถุสำหรับการโหลด |
13 | ReadString อ่านข้อความบรรทัดเดียว |
14 | SerializeClass อ่านหรือเขียนการอ้างอิงคลาสไปยังอ็อบเจ็กต์ CArchive ขึ้นอยู่กับทิศทางของ CArchive |
15 | SetLoadParams กำหนดขนาดที่อาร์เรย์โหลดจะเติบโต ต้องถูกเรียกก่อนที่จะโหลดวัตถุใด ๆ หรือก่อนหน้านี้MapObject หรือ ReadObject ถูกเรียก. |
16 | SetObjectSchema ตั้งค่าสคีมาอ็อบเจ็กต์ที่เก็บในอ็อบเจ็กต์ไฟล์เก็บถาวร |
17 | SetStoreParams ตั้งค่าขนาดตารางแฮชและขนาดบล็อกของแผนที่ที่ใช้เพื่อระบุอ็อบเจ็กต์ที่ไม่ซ้ำกันระหว่างกระบวนการทำให้เป็นอนุกรม |
18 | Write เขียนไบต์ดิบ |
19 | WriteClass เขียนอ้างอิงถึงไฟล์ CRuntimeClass ไปที่ CArchive |
20 | WriteObject เรียกใช้ฟังก์ชัน Serialize ของวัตถุเพื่อจัดเก็บ |
21 | WriteString เขียนข้อความบรรทัดเดียว |
นี่คือรายชื่อตัวดำเนินการที่ใช้ในการจัดเก็บและดึงข้อมูล
ซีเนียร์ | ชื่อและคำอธิบาย |
---|---|
1 | operator << จัดเก็บอ็อบเจ็กต์และประเภทดั้งเดิมไปยังที่เก็บถาวร |
2 | operator >> โหลดอ็อบเจ็กต์และประเภทดั้งเดิมจากที่เก็บถาวร |
ให้เราดูเป็นตัวอย่างง่ายๆโดยการสร้างแอปพลิเคชันที่ใช้กล่องโต้ตอบ MFC ใหม่
Step 1 - ลากปุ่มควบคุมการแก้ไขหนึ่งปุ่มและปุ่มสองปุ่มตามที่แสดงในภาพรวมต่อไปนี้

Step 2 - เพิ่มตัวแปรควบคุม m_editCtrl และตัวแปรค่า m_strEdit สำหรับการควบคุมการแก้ไข
Step 3 - เพิ่มตัวจัดการเหตุการณ์คลิกสำหรับปุ่มเปิดและบันทึก
Step 4 - นี่คือการใช้งานตัวจัดการเหตุการณ์
void CMFCFileProcessingDlg::OnBnClickedButtonOpen() {
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CFile file;
file.Open(L"ArchiveText.rpr", CFile::modeRead);
if(file) {
CArchive ar(&file, CArchive::load);
ar >> m_strEdit;
ar.Close();
file.Close();
}
UpdateData(FALSE);
}
void CMFCFileProcessingDlg::OnBnClickedButtonSave() {
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_strEdit.GetLength() == 0) {
AfxMessageBox(L"You must enter the name of the text.");
return;
}
CFile file;
file.Open(L"ArchiveText.rpr", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
ar << m_strEdit;
ar.Close();
file.Close();
}
Step 5 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้

Step 6- เขียนอะไรบางอย่างแล้วคลิกบันทึก มันจะบันทึกข้อมูลในรูปแบบไบนารี

Step 7- ลบการทดสอบออกจากการควบคุมการแก้ไข เมื่อคุณคลิกเปิดให้สังเกตว่ามีการโหลดข้อความเดิมอีกครั้ง