Mfc-file-system

提供:Dev Guides
移動先:案内検索

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_CREATEIDC_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

  • Serialize* 関数から呼び出され、逆シリアル化されているオブジェクトのバージョンを判断します。
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

  • CRuntimeClass* への参照をCArchiveに書き込みます。
20

WriteObject

格納するためにオブジェクトのSerialize関数を呼び出します。

21

WriteString

1行のテキストを書き込みます。

データの保存と取得に使用される演算子のリストは次のとおりです

Sr.No. Name & Description
1

operator <<

オブジェクトとプリミティブ型をアーカイブに保存します。

2

operator >>

アーカイブからオブジェクトとプリミティブ型をロードします。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-次のスナップショットに示すように、1つの編集コントロールと2つのボタンをドラッグします。

新しいMFC

ステップ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 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

新しいMFC

  • ステップ6 *-何かを書いて[保存]をクリックします。 データをバイナリ形式で保存します。

新しいMFC

  • ステップ7 *-編集コントロールからテストを削除します。 [開く]をクリックすると、同じテキストが再び読み込まれることを確認します。