MFC-ファイルシステム
この章では、ファイルシステムのさまざまなコンポーネントについて説明します。
ドライブ
A driveは、情報を保存できるようにコンピューターに接続された物理デバイスです。論理ディスク、論理ボリューム、または仮想ディスク(略してVDまたはvdisk)は、コンピューターシステム内の1つ以上の物理ディスクドライブに使用可能なストレージ容量の領域を提供する仮想デバイスです。ドライブには、ハードディスク、CD ROM、DVD ROM、フラッシュ(USB)ドライブ、メモリカードなどがあります。
実行する主な操作の1つは、コンピューター上のドライブのリストを取得することです。
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
Step 1 −ツールボックスからボタンを1つドラッグし、そのキャプションを[ドライブ情報を取得]に変更します。
Step 2 −静的制御のキャプション(TODO行)を削除し、そのIDをIDC_STATIC_TEXTに変更します。
Step 3 −ボタンを右クリックして、「イベントハンドラーの追加」を選択します。
Step 4 − BN_CLICKEDメッセージタイプを選択し、[追加と編集]ボタンをクリックします。
Step 5 −静的テキストコントロールの値変数m_strDrivesを追加します。
コンピュータ上のドライブをサポートするために、Win32ライブラリはMicrosoft WindowのGetLogicalDrives()関数を提供します。この関数は、現在のコンピュータ上のすべてのドライブのリストを取得します。
Step 6 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 7 −ボタンをクリックすると、コンピューター上のすべてのドライブが表示されます。
ディレクトリ
コンピューティングでは、 directoryは、他のコンピュータファイル、場合によっては他のディレクトリへの参照を含むファイルシステムのカタログ構造です。ディレクトリは物理的な場所です。ドライブでは利用できない操作を処理できます。
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
Step 1−ツールボックスから3つのボタンをドラッグします。キャプションを「ディレクトリの作成」、「ディレクトリの削除」、「ディレクトリの移動」に変更します。
Step 2 −これらのボタンのIDを次のように変更します IDC_BUTTON_CREATE、 IDC_BUTTON_DELETE そして IDC_BUTTON_MOVE。
Step 3 −TODO行を削除します。
Step 4 −ボタンごとにイベントハンドラーを追加します。
Step 5 −ディレクトリを作成するには、Win32ライブラリのCreateDirectory()メソッドを呼び出すことができます。
Step 6 −これは、1つのディレクトリを作成してからさらに2つのサブディレクトリを作成する[作成]ボタンイベントハンドラの実装です。
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 − [ディレクトリの作成]ボタンをクリックすると、これらのディレクトリが作成されます。
Step 11 − [ディレクトリの削除]ボタンをクリックすると、Dir1が削除されます。
ファイル処理
ほとんど file processing MFCアプリケーションでは、という名前のクラスと組み合わせて実行されます CArchive。CArchiveクラスは、アプリケーションと、データを格納または利用可能にするために使用されるメディアとの間のリレーとして機能します。これにより、オブジェクトの複雑なネットワークを永続的なバイナリ形式(通常はディスクストレージ)で保存し、それらのオブジェクトが削除された後も存続することができます。
CArchiveクラスのメソッドのリストは次のとおりです-
シニア番号 | 名前と説明 |
---|---|
1 | Abort 例外をスローせずにアーカイブを閉じます。 |
2 | Close 書き込まれていないデータをフラッシュし、 CFile。 |
3 | Flush 未書き込みのデータをアーカイブバッファからフラッシュします。 |
4 | GetFile このアーカイブのCFileオブジェクトポインタを取得します。 |
5 | GetObjectSchema から呼び出されます Serialize デシリアライズされるオブジェクトのバージョンを判別する関数。 |
6 | IsBufferEmpty WindowsSocketsの受信プロセス中にバッファが空にされたかどうかを判別します。 |
7 | IsLoading アーカイブがロードされているかどうかを判別します。 |
8 | IsStoring アーカイブが保存されているかどうかを判別します。 |
9 | MapObject ファイルにシリアル化されていないが、サブオブジェクトが参照できるオブジェクトをマップに配置します。 |
10 | Read 生のバイトを読み取ります。 |
11 | ReadClass 以前に保存されたクラス参照を読み取ります WriteClass。 |
12 | ReadObject ロードのためにオブジェクトのSerialize関数を呼び出します。 |
13 | ReadString 1行のテキストを読み取ります。 |
14 | SerializeClass CArchiveの方向に応じて、CArchiveオブジェクトへのクラス参照を読み取りまたは書き込みます。 |
15 | SetLoadParams ロード配列が大きくなるサイズを設定します。オブジェクトがロードされる前、または前に呼び出す必要がありますMapObject または ReadObject と呼ばれます。 |
16 | SetObjectSchema アーカイブオブジェクトに格納されているオブジェクトスキーマを設定します。 |
17 | SetStoreParams シリアル化プロセス中に一意のオブジェクトを識別するために使用されるマップのハッシュテーブルサイズとブロックサイズを設定します。 |
18 | Write 生のバイトを書き込みます。 |
19 | WriteClass への参照を書き込みます CRuntimeClass CArchiveに。 |
20 | WriteObject オブジェクトのSerialize関数を呼び出して保存します。 |
21 | WriteString 1行のテキストを書き込みます。 |
データの保存と取得に使用される演算子のリストは次のとおりです
シニア番号 | 名前と説明 |
---|---|
1 | operator << オブジェクトとプリミティブ型をアーカイブに格納します。 |
2 | operator >> アーカイブからオブジェクトとプリミティブ型をロードします。 |
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
Step 1 −次のスナップショットに示すように、1つの編集コントロールと2つのボタンをドラッグします。
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−編集コントロールからテストを削除します。[開く]をクリックすると、同じテキストが再度読み込まれることを確認します。