Mfc-file-system
MFC-ファイルシステム
この章では、ファイルシステムのさまざまなコンポーネントについて説明します。
ドライブ
- ドライブ*は、情報を保存できるようにコンピューターに接続された物理デバイスです。 論理ディスク、論理ボリューム、または仮想ディスク(略してVDまたはvdisk)は、コンピューターシステム内の1つ以上の物理ディスクドライブに使用可能なストレージ容量の領域を提供する仮想デバイスです。 ドライブには、ハードディスク、CD ROM、DVD ROM、フラッシュ(USB)ドライブ、メモリカードなどがあります。
実行する主な操作の1つは、コンピューター上のドライブのリストを取得することです。
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
- ステップ1 *-ツールボックスから1つのボタンをドラッグし、キャプションをGet Drives Infoに変更します。
- ステップ2 *-静的コントロールのキャプション(TODO行)を削除し、そのIDをIDC_STATIC_TEXTに変更します。
- ステップ3 *-ボタンを右クリックして、[イベントハンドラーの追加]を選択します。
- ステップ4 *-BN_CLICKEDメッセージタイプを選択し、[追加と編集]ボタンをクリックします。
- ステップ5 *-静的テキストコントロールの値変数m_strDrivesを追加します。
コンピューター上のドライブをサポートするために、Win32ライブラリはMicrosoft WindowのGetLogicalDrives()関数を提供し、現在のコンピューター上のすべてのドライブのリストを取得します。
- ステップ6 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
- ステップ7 *-ボタンをクリックすると、コンピューター上のすべてのドライブが表示されます。
ディレクトリ
コンピューティングでは、*ディレクトリ*は、他のコンピューターファイル、および場合によっては他のディレクトリへの参照を含むファイルシステムカタログ構造です。 ディレクトリは物理的な場所です。 ドライブで使用できない操作を処理できます。
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
- ステップ1 *-ツールボックスから3つのボタンをドラッグします。 キャプションを変更して、ディレクトリの作成、ディレクトリの削除、ディレクトリの移動を行います。
ステップ2 *-これらのボタンのIDを *IDC_BUTTON_CREATE 、 IDC_BUTTON_DELETE 、および IDC_BUTTON_MOVE に変更します。
- ステップ3 *-TODO行を削除します。
- ステップ4 *-各ボタンにイベントハンドラーを追加します。
- ステップ5 *-ディレクトリを作成するには、Win32ライブラリのCreateDirectory()メソッドを呼び出します。
- ステップ6 *-Createボタンイベントハンドラーの実装で、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);
}
ステップ7 *-ディレクトリを削除するには、Win32ライブラリの RemoveDirectory()*関数を呼び出します。 削除ボタンイベントハンドラーの実装を次に示します。
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");
}
- ステップ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");
}
- ステップ9 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
- ステップ10 *-[ディレクトリの作成]ボタンをクリックすると、これらのディレクトリが作成されます。
- ステップ11 *-[ディレクトリの削除]ボタンをクリックすると、Dir1が削除されます。
ファイル処理
MFCアプリケーションのほとんどの*ファイル処理*は、 CArchive という名前のクラスと組み合わせて実行されます。 CArchiveクラスは、アプリケーションと、データの保存または使用可能にするために使用されるメディアとの間のリレーとして機能します。 これにより、オブジェクトの複雑なネットワークを永続的なバイナリ形式(通常はディスクストレージ)で保存し、それらのオブジェクトを削除した後も保持できます。
CArchiveクラスのメソッドのリストは次のとおりです-
以下の____は、CDCクラスのメソッドのリストです。
Sr.No. | Name & Description |
---|---|
1 |
Abort 例外をスローせずにアーカイブを閉じます。 |
2 |
Close 書き込まれていないデータをフラッシュし、 CFile から切断します。 |
3 |
Flush アーカイブバッファから未書き込みデータをフラッシュします。 |
4 |
GetFile このアーカイブのCFileオブジェクトポインターを取得します。 |
5 |
GetObjectSchema
|
6 |
IsBufferEmpty Windows Sockets受信プロセス中にバッファが空になったかどうかを判断します。 |
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
|
20 |
WriteObject 格納するためにオブジェクトのSerialize関数を呼び出します。 |
21 |
WriteString 1行のテキストを書き込みます。 |
データの保存と取得に使用される演算子のリストは次のとおりです
Sr.No. | Name & Description |
---|---|
1 |
operator << オブジェクトとプリミティブ型をアーカイブに保存します。 |
2 |
operator >> アーカイブからオブジェクトとプリミティブ型をロードします。 |
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
- ステップ1 *-次のスナップショットに示すように、1つの編集コントロールと2つのボタンをドラッグします。
ステップ2 *-編集制御用に制御変数 *m_editCtrl および値変数 m_strEdit を追加します。
- ステップ3 *-[開く]ボタンと[保存]ボタンのクリックイベントハンドラーを追加します。
- ステップ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();
}
- ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
- ステップ6 *-何かを書いて[保存]をクリックします。 データをバイナリ形式で保存します。
- ステップ7 *-編集コントロールからテストを削除します。 [開く]をクリックすると、同じテキストが再び読み込まれることを確認します。