CreateFile

https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/ms684342.aspx https://msdn.microsoft.com/ja-jp/library/cc430204.aspx https://msdn.microsoft.com/ja-jp/library/cc429808.aspx https://msdn.microsoft.com/ja-jp/library/aa378832.aspx https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/cc429605.aspx https://msdn.microsoft.com/ja-jp/library/cc428987.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/cc429164.aspx https://msdn.microsoft.com/ja-jp/library/cc429689.aspx https://msdn.microsoft.com/ja-jp/library/aa365780.aspx https://msdn.microsoft.com/ja-jp/library/cc429615.aspx https://msdn.microsoft.com/ja-jp/library/aa365576.aspx https://msdn.microsoft.com/ja-jp/library/cc429164.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/cc429164.aspx https://msdn.microsoft.com/ja-jp/library/aa374892.aspx https://msdn.microsoft.com/ja-jp/library/cc429605.aspx https://msdn.microsoft.com/ja-jp/library/cc429611.aspx https://msdn.microsoft.com/ja-jp/library/cc429689.aspx https://msdn.microsoft.com/ja-jp/library/cc429164.aspx https://msdn.microsoft.com/ja-jp/library/cc429130.aspx https://msdn.microsoft.com/ja-jp/library/ms684342.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/cc428987.aspx https://msdn.microsoft.com/ja-jp/library/aa379607.aspx https://msdn.microsoft.com/ja-jp/library/cc430113.aspx https://msdn.microsoft.com/ja-jp/library/cc430204.aspx

次のオブジェクトを作成するか開き、そのオブジェクトをアクセスするために利用できるハンドルを返します。

•コンソール

•通信リソース

•ディレクトリ(開くだけで作成は不可能)

•ディスクデバイス(Windows NT/2000 のみ)

•ファイル

•メールスロット

•パイプ

HANDLE CreateFile(
  LPCTSTR lpFileName,                         // ファイル名
  DWORD dwDesiredAccess,                      // アクセスモード
  DWORD dwShareMode,                          // 共有モード
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
  DWORD dwCreationDisposition,                // 作成方法
  DWORD dwFlagsAndAttributes,                 // ファイル属性
  HANDLE hTemplateFile                        // テンプレートファイルのハンドル
);

パラメータ

lpFileName
作成または開く対象のオブジェクトの名前を保持している、NULL で終わる文字列へのポインタを指定します。

Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加してください。詳細については、MSDN ライブラリの「」(ファイル名の規則)を参照してください。

Windows 95/98:文字列の長さは、最大 MAX_PATH 文字です。

dwDesiredAccess
オブジェクトへのアクセスのタイプを指定します。アプリケーションは、読み取りアクセス、書き込みアクセス、読み書きアクセス、デバイス問い合わせアクセスのいずれかを取得できます。次の値の任意の組み合わせを指定します。
意味
0オブジェクトへのデバイス問い合わせアクセスを指定します。アプリケーションは、デバイスにアクセスすることなく、デバイス属性の問い合わせを行えます。
GENERIC_READオブジェクトへの読み取りアクセスを指定します。データの読み取りとファイルポインタの移動ができます。読み書きアクセスを行うには、GENERIC_WRITE と共に指定します。
GENERIC_WRITEオブジェクトへの書き込みアクセスを指定します。データの書き込みとファイルポインタの移動ができます。読み書きアクセスを行うには、GENERIC_READ と共に指定します。

また、次のアクセスフラグを指定することもできます。

Value 値参照箇所
DELETEMSDN ライブラリの「」
READ_CONTROLMSDN ライブラリの「」
WRITE_DACMSDN ライブラリの「」
WRITE_OWNERMSDN ライブラリの「」
SYNCHRONIZEMSDN ライブラリの「」
STANDARD_RIGHTS_REQUIREDMSDN ライブラリの「」
STANDARD_RIGHTS_READMSDN ライブラリの「」
STANDARD_RIGHTS_WRITEMSDN ライブラリの「」
STANDARD_RIGHTS_EXECUTEMSDN ライブラリの「」
STANDARD_RIGHTS_ALLMSDN ライブラリの「」
SPECIFIC_RIGHTS_ALL 構造体
ACCESS_SYSTEM_SECURITY 構造体
MAXIMUM_ALLOWED 構造体
GENERIC_READ 構造体
GENERIC_WRITE 構造体
GENERIC_EXECUTE 構造体
GENERIC_ALL 構造体

dwShareMode
オブジェクトの共有方法を指定します。0 を指定すると、オブジェクトを共有できません。このハンドルを閉じない限り、それ以降にこのオブジェクトを開こうとしても失敗します。

オブジェクトを共有するには、次の値のいずれかまたは任意の組み合わせを指定します。

意味
FILE_SHARE_DELETEWindows NT/2000:これ以降、オブジェクトを開こうとしたときに削除アクセスを要求した場合のみ、その操作を許可します。
FILE_SHARE_READこれ以降、オブジェクトを開こうとしたときに読み取りアクセスを要求した場合のみ、その操作を許可します。
FILE_SHARE_WRITEこれ以降、オブジェクトを開こうとしたときに書き込みアクセスを要求した場合のみ、その操作を許可します。

lpSecurityAttributes
取得したハンドルを子プロセスへ継承することを許可するかどうかを決定する、1 個の 構造体へのポインタを指定します。NULL を指定すると、そのハンドルは継承できません。

Windows NT/2000:この構造体の lpSecurityDescriptor メンバでセキュリティ記述子を設定します。lpSecurityAttributes パラメータで NULL を指定すると、既定のセキュリティ記述子が適用されます。このパラメータを有効にするには、作成先のファイルシステムがファイルとディレクトリのセキュリティをサポートしていなければなりません。

dwCreationDisposition
ファイルが存在する場合、または存在しない場合のファイルの扱い方を指定します。このパラメータの詳細については、この関数の「解説」を参照してください。このパラメータには、次の値のいずれかを指定しなければなりません。
意味
CREATE_NEW新しいファイルを作成します。指定したファイルが既に存在している場合、この関数は失敗します。
CREATE_ALWAYS新しいファイルを作成します。指定したファイルが既に存在している場合、そのファイルを上書きし、既存の属性を消去します。
OPEN_EXISTINGファイルを開きます。指定したファイルが存在していない場合、この関数は失敗します。

デバイスに対して CreateFile 関数を呼び出す際に OPEN_EXISTING フラグを使うべき状況については、この関数の「解説」を参照してください。

OPEN_ALWAYSファイルが存在している場合、そのファイルを開きます。指定したファイルが存在していない場合、この関数は dwCreationDisposition パラメータで CREATE_NEW が指定されていたと仮定して新しいファイルを作成します。
TRUNCATE_EXISTINGファイルを開き、ファイルのサイズを 0 バイトにします。呼び出し側プロセスは、dwDesiredAccess パラメータで、少なくとも GENERIC_WRITE アクセス権を指定しなければなりません。指定したファイルが存在していない場合、この関数は失敗します。

dwFlagsAndAttributes
ファイルの属性とフラグを指定します。

属性は、次の属性の任意の組み合わせを指定します。ただし、FILE_ATTRIBUTE_NORMAL は単独で指定します。FILE_ATTRIBUTE_NORMAL と他の属性のいずれかを共に指定すると、FILE_ATTRIBUTE_NORMAL は無効になります。

属性意味
FILE_ATTRIBUTE_ARCHIVEこのファイルをアーカイブするべきです。アプリケーションはこの属性を、ファイルのバックアップや削除のためのマークとして使います。
FILE_ATTRIBUTE_ENCRYPTEDこのファイルまたはディレクトリを暗号化するよう指示します。ファイルに対して指定した場合、そのファイル内のすべてのデータを暗号化することを意味します。ディレクトリに対して指示した場合、その中に新しく作成されるファイルとサブディレクトリに対して、既定で暗号化を行うことを意味します。

FILE_ATTRIBUTE_SYSTEM と共に指定すると、FILE_ATTRIBUTE_ENCRYPTED フラグは無効になります。

FILE_ATTRIBUTE_HIDDENこのファイルは隠しファイルです。通常のディレクトリリスティングでは表示されません。
FILE_ATTRIBUTE_NORMALこのファイルに特に属性を設定しません。単独で指定した場合にのみ、この属性は有効です。
FILE_ATTRIBUTE_NOT_CONTENT_INDEXEDWindows 2000:このファイルを、「インデックスサービス」の対象にしません。
FILE_ATTRIBUTE_OFFLINEWindows 2000:このファイルのデータは、すぐには利用できません。この属性は、このファイルのデータがオフライン記憶装置へ物理的に移動されたことを示します。この属性は、Windows 2000 の階層記憶管理ソフトウェアである「リモート記憶域」が利用するものです。アプリケーションは、任意にこの属性を変更するべきではありません。
FILE_ATTRIBUTE_READONLYこのファイルは読み取り専用です。アプリケーションはこのファイルの読み取りを行えますが、書き込みや削除はできません。
FILE_ATTRIBUTE_SYSTEMこのファイルは、オペレーティングシステムの一部、またはオペレーティングシステム専用のファイルです。
FILE_ATTRIBUTE_TEMPORARYこのファイルは、一時ファイルとして使われています。ファイルシステムは、データをハードディスクのような大容量記憶装置へ書き込む代わりに、高速なアクセスが行えるよう、すべてのデータをメモリ内に維持することを試みます。アプリケーションは、必要がなくなった段階で一時ファイルをすぐに削除するべきです。

dwFlagsAndAttributes パラメータでは、次のフラグの任意の組み合わせを指定します。

フラグ意味
FILE_FLAG_WRITE_THROUGHキャッシュに書き込まれたデータを直接ディスクに書き込むようシステムに指示します。システムは依然としてキャッシュ書き込み操作を行えますが、ディスクへの遅延書き込みは無効になります。
FILE_FLAG_OVERLAPPEDオブジェクトを初期化するようシステムに指示します。その結果、非常に長い時間のかかる処理に対して ERROR_IO_PENDING が返るようになります。この処理が終了すると、指定されたイベントはシグナル状態に設定されます。

このフラグを指定したときは、ファイルの読み書きを行う関数で 1 個の 構造体を指定しなければなりません。つまり、FILE_FLAG_OVERLAPPED を指定した場合、アプリケーションはオーバーラップ読み書きを行わなければなりません。

FILE_FLAG_OVERLAPPED を指定した場合、システムはファイルポインタを管理しません。ファイルの読み書きを行う関数に対し、1 個の OVERLAPPED 構造体を指している lpOverlapped パラメータの一部として、ファイルの位置を渡さなければなりません。

また、このフラグを指定した場合、1 つのハンドルに対して複数の操作(たとえば、読み取りと書き込みそれぞれの操作)を同時に行うことができます。

FILE_FLAG_NO_BUFFERINGバッファやキャッシュを使わずにファイルを開くようシステムに指示します。FILE_FLAG_OVERLAPPED フラグと共に指定すると、非同期操作のパフォーマンスが向上します。I/O 操作を行う際に、メモリマネージャの同期処理に依存する必要がなくなるからです。しかし、データがキャッシュ内に存在しないので、一部の I/O 操作には多くの時間がかかります。

このフラグを指定した場合、アプリケーションは次の各条件を満たさなければなりません。

•ファイルアクセスの開始オフセットを、ボリュームのセクタサイズの整数倍にしなければなりません。

•ファイルアクセスのバイト数を、ボリュームのセクタサイズの整数倍にしなければなりません。たとえば、セクタサイズが 512 バイトの場合、512 バイト、1,024 バイト、2,048 バイトの読み書きはできますが、335 バイト、981 バイト、7,171 バイトなどの読み書きはできません。

•読み書き操作用のバッファのアドレス(メモリ内のアドレス)を、ボリュームのセクタサイズの整数倍に整列(セクタ整列)させなければなりません。ディスクによっては、この要件を満たせないこともあります。

3 番目の条件を満たす、つまりバッファをボリュームのセクタサイズの整数倍の位置に整列させる 1 つの方法は、 関数を使ってバッファを割り当てることです。VirtualAlloc 関数が割り当てるメモリは、オペレーティングシステムのメモリページサイズの整数倍の位置に整列されています。メモリページとボリュームのセクタサイズは両方とも 2 のべき乗なので、このメモリは、ボリュームのセクタサイズの整数倍のアドレスにも整列されます。

ボリュームのセクタサイズを求めるには、GetDiskFreeSpace 関数を使います。また、ページサイズを調べるには、 関数を使います。

FILE_FLAG_RANDOM_ACCESSこのファイルをランダムアクセスすることをシステムに指示します。システムは、この指定をファイルのキャッシングを最適化するためのヒントとして使います。
FILE_FLAG_SEQUENTIAL_SCANファイルを最初から最後までシーケンシャルに(連続)アクセスすることをシステムに指示します。システムは、この指定をファイルのキャッシングを最適化するためのヒントとして使います。この場合、アプリケーションはランダムアクセスを行う目的でファイルポインタを移動することはできますが、最適なキャッシングが達成できなくなる可能性があります。しかし、ランダムアクセスを正しく行えることは保証されています。

このフラグを指定すると、大きなファイルをシーケンシャルアクセスするアプリケーションのパフォーマンスが向上します。基本的にシーケンシャルアクセスを行い、ときどき小規模な範囲をスキップするアプリケーションでは、特に大きな向上が見られることもあります。

FILE_FLAG_DELETE_ON_CLOSEFILE_FLAG_DELETE_ON_CLOSE を指定したハンドルを除き、このファイルに関連付けられているすべてのハンドルが閉じた段階で、そのファイルを即座に削除するようシステムに指示します。

それ以降、FILE_SHARE_DELETE を指定しない限り、このファイルを開くよう要求しても失敗します。

FILE_FLAG_BACKUP_SEMANTICSWindows NT/2000:バックアップまたは復元操作の目的で、ファイルを開くまたは作成するようシステムに指示します。呼び出し側プロセスがファイルセキュリティに関して十分な権限を備えていることを前提として、システムは、そのプロセスがファイルセキュリティのチェックを無効にできることを保証します。これに関連する権限は、SE_BACKUP_NAME と SE_RESTORE_NAME です。

ディレクトリのハンドルを取得する目的で、このフラグを指定することもできます。特定の Win32 関数で、ファイルハンドルの代わりにディレクトリハンドルを指定することもできます。

FILE_FLAG_POSIX_SEMANTICSPOSIX(UNIX ベースのポータブル OS)の規則に従ってファイルにアクセスするようシステムに指示します。この規則には、ファイル名が同じで大文字と小文字だけが異なる複数のファイルを認めるファイルシステムに対し、それらのファイルへのアクセスを認めることが含まれます。このフラグを指定する場合、注意が必要です。MS-DOS または 16 ビット版 Windows からは、このフラグを指定して作成したファイルにアクセスできないからです。
FILE_FLAG_OPEN_REPARSE_POINTこのフラグを指定すると、NTFS の再解析ポイントで再解析を行うことを禁止します。このフラグを指定してファイルを開くと、再解析ポイントを制御するフィルタが動作しているかどうかにかかわりなく、ファイルハンドルが返ります。このフラグと共に CREATE_ALWAYS フラグを指定することはできません。
FILE_FLAG_OPEN_NO_RECALLファイルのデータを要求すると共に、そのデータを継続的にリモート記憶域に配置するべきことをシステムに指示します。そのファイルをローカル記憶域へ復帰させるべきではありません。このフラグは、リモート記憶域システム、言い換えると階層記憶管理システムで使うことを意図しています。

CreateFile 関数が名前付きパイプのクライアント側を開く場合、dwFlagsAndAttributes パラメータでセキュリティのサービス品質(Security Quality of Service)情報を指定できます。詳細については、MSDN ライブラリの「」を参照してください。呼び出し側アプリケーションが SECURITY_SQOS_PRESENT フラグを指定している場合、dwFlagsAndAttributes パラメータには、次の値のいずれかまたは任意の組み合わせを指定できます。

意味
SECURITY_ANONYMOUS名前なし(Anonymous)偽装レベルでクライアントを偽装するよう指定します。
SECURITY_IDENTIFICATION識別(Identification)偽装レベルでクライアントを偽装するよう指定します。
SECURITY_IMPERSONATION偽装(Impersonation)偽装レベルでクライアントを偽装するよう指定します。
SECURITY_DELEGATION代理(Delegation)偽装レベルでクライアントを偽装するよう指定します。
SECURITY_CONTEXT_TRACKINGセキュリティ追跡モードが動的であることを指定します。このフラグを指定しない場合、セキュリティ追跡モードは静的です。詳細については、MSDN ライブラリで「Q101378」を参照してください。
SECURITY_EFFECTIVE_ONLYクライアントのセキュリティコンテキストのうち、有効になっている部分だけをサーバーで利用できるようにします。このフラグを指定しない場合は、すべての部分が利用できます。

このフラグを指定すると、クライアントは、サーバーがクライアントを偽装する際に利用できるグループと権限を制限できます。

SECURITY_SQOS_PRESENTクライアントが CreateFile 関数を使ってパイプのクライアント側のハンドルを開く際に、サーバーの偽装レベルを指定します。

偽装とは、セキュリティコンテキストが異なる複数のプロセス間で名前付きパイプを確立し、一方のプロセスが保持しているスレッドをもう一方のプロセスで実行する際に、権限の調整を行うことを意味します。特にクライアントのスレッドをサーバー側で実行する場合、サーバーのアクセス権限がクライアントのアクセス権限を上回っているのが普通です。そのため、クライアントのスレッドを単純にサーバー側で実行すると、クライアント側で実行した場合には得られないはずの結果がもたらされる可能性があります。このような事態を防止するために、クライアントと同等のアクセス権限をサーバー側で設定する必要があります。このことを「サーバーがクライアントを偽装する」(クライアントの偽装)と呼び、クライアントのセキュリティ情報をサーバーへ伝えるためにアクセストークンを使います。詳細については、MSDN ライブラリの「ImpersonateNamedPipeClient」と「RevertToSelf」も参照してください。

hTemplateFile
テンプレートファイルに対して GENERIC_READ アクセス権を備えているハンドルを指定します。テンプレートファイルは、作成対象のファイルに対して、ファイル属性と拡張属性を提供します。

Windows 95:NULL を指定してください。何かハンドルを指定すると、この関数は失敗し、GetLastError は ERROR_NOT_SUPPORTED を返します。

戻り値

関数が成功すると、指定したファイルに対する、開いているハンドルが返ります。dwCreationDistribution パラメータで CREATE_ALWAYS または OPEN_ALWAYS を指定し、lpFileName パラメータで指定したファイルが既に存在している場合、(CreateFile が成功した場合でも) 関数は ERROR_ALREADY_EXISTS を返します。CreateFile を実行する前にファイルが存在していない場合、GetLastError は 0 を返します。

関数が失敗すると、INVALID_HANDLE_VALUE が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。

解説

CreateFile が返したオブジェクトハンドルを閉じるには、 関数を使います。

前述のとおり、dwDesiredAccess パラメータで 0 を指定すると、実際にデバイスにアクセスすることなく、アプリケーションがデバイス属性を問い合わせることができます。たとえば、フロッピーディスクドライブにフロッピーディスクが挿入されていない状態で、アプリケーションが利用可能なフロッピーディスクドライブのサイズ(たとえば 5 インチか 3.5 インチか)とフォーマット(2DD か 2HD か)を判断したい場合に、このような問い合わせは役立ちます。

MAPI:詳細については、MSDN ライブラリの「」を参照してください。

ファイル

フロッピーディスクが入っていないフロッピーディスクドライブや、CD-ROM が入っていない CD-ROM ドライブにファイルを作成しようとすると、システムはユーザーに対して、フロッピーディスクや CD-ROM を挿入するよう要求するメッセージボックスを表示します。このメッセージボックスを表示しないようにするには、SEM_FAILCRITICALERRORS を指定して 関数を呼び出します。

新しいファイルを作成する際に、CreateFile 関数は次の動作を実行します。

dwFlagsAndAttributes パラメータで指定された属性とフラグに、FILE_ATTRIBUTE_ARCHIVE 属性を組み合わせます。

•ファイルの長さを、0 に設定します。

hTemplateFile パラメータが指定されている場合は、テンプレートファイルが提供している拡張属性を新しいファイルへコピーします。

既存のファイルを開く際に、CreateFile 関数は次の動作を実行します。

dwFlagsAndAttributes パラメータで指定されたフラグに、既存のファイルの属性を組み合わせます。dwFlagsAndAttributes パラメータので指定されたファイル属性は無視します。

dwCreationDistribution パラメータの指定に応じて、ファイルの長さを設定します。

hTemplateFile パラメータを無視します。

lpSecurityAttributes パラメータが NULL ではない場合、 構造体の lpSecurityDescriptor メンバだけを無視し、他のメンバを使います。bInheritHandle メンバは、ファイルハンドルが継承可能かどうかを示す唯一の手段です。

Windows NT/2000:ファイルの名前変更または削除を行い、その後短時間のうちに復元を行うと、システムは復元対象のファイルの情報をキャッシュ内で検索します。キャッシュに置かれている情報として、短い名前と長い名前のペア、および作成日時が挙げられます。

Windows NT/2000:NTFS のような特定のファイルシステムは、個別のファイルとディレクトリの圧縮または暗号化をサポートしています。このようなファイルシステムでフォーマットされているボリュームでは、新しいファイルは親ディレクトリの圧縮と暗号化の属性を継承します。

CreateFile 関数を使ってファイルの圧縮状態を設定することはできません。ファイルの圧縮状態を設定するには、 関数を使ってください。

パイプ

CreateFile 関数が名前付きパイプのクライアント側を開く場合、この関数はリッスン状態にある名前付きパイプの任意のインスタンスを使います。パイプを開いた側のプロセスは、必要に応じてハンドルを何回でも複製できますが、いったんパイプを開いた後は、ほかのクライアントが名前付きパイプのインスタンスを開くことはできません。パイプを開く際に指定するアクセス権は、 関数の dwOpenMode パラメータで指定したアクセス権と互換性のあるものでなければなりません。パイプの詳細については、MSDN ライブラリの「」を参照してください。

メールスロット

CreateFile 関数を使ってメールスロットのクライアント側を開く場合、メールスロットのサーバーが 関数を使ってメールスロットを作成する前に、メールスロットのクライアント側がローカルのメールスロットを開こうとすると、この関数は INVALID_HANDLE_VALUE を返します。メールスロットの詳細については、MSDN ライブラリの「」を参照してください。

通信リソース

CreateFile 関数は、シリアルポートの COM1 など、通信リソースのハンドルを作成できます。通信リソースを開くには、dwCreationDistribution パラメータで OPEN_EXISTING、hTemplate パラメータで NULL を指定しなければなりません。読み取り、書き込み、読み書きのアクセスを指定できますし、オーバーラップ I/O を行う目的でハンドルを開くこともできます。通信の詳細については、MSDN ライブラリの「Communications」を参照してください。

ディスクデバイス

CreateFile 関数でライトスルー(キャッシュを使わない)を指示しなかった場合であっても、ファイルシステム側の選択により、キャッシュを使わずにボリュームのハンドルが開かれることがあります。開発者は、Microsoft のすべてのファイルシステムがキャッシュを使わずにボリュームのハンドルを開くことを想定するべきです。キャッシュを使わないファイル I/O に関する制限(遅延書き込みが無効になるなど)は、ボリュームにも適用されます。

データがキャッシュに置かれていない場合でも、ファイルシステムがバッファの整列を要求すること、または要求しないことがあります。いずれにしても、ボリュームを開く際にライトスルー(キャッシュを使わない)のオプションを指定した場合は、ボリュームでどのようなファイルシステムを使っているかにかかわりなく、バッファの整列が強制的に適用されます。どのファイルシステムでボリュームのハンドルを開く場合でも、ライトスルーを指定し、キャッシュを使わない I/O の制約に従うことを推奨します。

Windows NT/2000:CreateFile 関数を使って、ディスクドライブやディスクドライブ上のパーティションを開くことができます。この関数はディスクデバイスのハンドルを返しますが、 関数でそのハンドルを使えます。このような呼び出しを成功させるには、次の各要件を満たさなければなりません。

•ハードディスクでこの操作を成功させるには、呼び出し側は管理特権を備えていなければなりません。

•The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example:  ハードディスク x を開くには、lpFileName パラメータで \\.\PHYSICALDRIVEx と指定します。ハードディスクの番号は、0 から始まるオフセットで指定します。例を示します。

String 文字列意味
\\.\PHYSICALDRIVE2ユーザーのコンピュータの 3 番目の物理ドライブのハンドルを取得します。

物理ドライブを開く方法を示す例については、MSDN ライブラリの「Calling DeviceIoControl on Windows NT/2000」を参照してください。

•フロッピーディスク x や、ハードディスクのパーティション x を開くには、lpFileName パラメータで \\.\x: と指定します。例を示します。

文字列意味
\\.\A:ユーザーのコンピュータのドライブ A のハンドルを取得します。
\\.\C:ユーザーのコンピュータのドライブ C のハンドルを取得します。

ドライブ名の後に円記号(\)を付けないでください。文字列 "\\.\c:\" を指定すると、ドライブ C のルートディレクトリを意味します。

Windows 2000 では、「」(一意のボリューム名)を参照してボリュームを開くこともできます。この場合も、一意のボリューム名の後に円記号(\)を付けるべきではありません。

FILE_FLAG_NO_BUFFERING フラグを指定せずにディスクデバイスを開いた場合でも、すべての I/O バッファをセクタ整列させる(メモリ内のアドレスを、ボリュームのセクタサイズの整数倍の位置に整列させる)べきです。ディスクにもよりますが、この要件が自動的に適用されないこともあります。

Windows 95:論理ドライブを開く際は、この手法は機能しません。Windows 95 では、上記の形式で文字列を指定すると、CreateFile 関数はエラーを返します。代わりに、次の手順に従ってください。

dwCreationDistribution パラメータで、OPEN_EXISTING を指定しなければなりません。

•フロッピーディスクや、ハードディスクのパーティションを開く場合、dwShareMode パラメータで FILE_SHARE_WRITE フラグを指定しなければなりません。

テープドライブ

Windows NT/2000:\\.\TAPEx という形式のファイル名を使って、テープドライブを開くことができます。ここで、x は開くべきドライブの番号を指し、最初のテープドライブが番号 0 に相当します。テープドライブ 0 を開くには"\\\\.\\TAPE0" というファイル名を使います。バックアップまたは他のアプリケーションでテープドライブを操作する方法の詳細については、MSDN ライブラリの「」を参照してください。

コンソール

CreateFile 関数は、コンソール入力(CONIN$)のハンドルを作成できます。ハンドルの継承または複製によって、プロセスが、既に開いているコンソール入力のハンドルを保持している場合、そのプロセスはアクティブな画面バッファ(CONOUT$)のハンドルを作成することもできます。呼び出し側プロセスは、継承されたコンソール、または AllocConsole 関数を呼び出して割り当てたコンソールにアタッチしておかなければなりません。コンソールのハンドルを取得するには、CreateFile 関数のパラメータを次のように設定します。

パラメータ
lpFileNameコンソール入力を指定するには CONIN$、コンソール出力を指定するには CONOUT$ という値を使います。
 SetStdHandle 関数を使って標準入力ハンドルをリダイレクトした場合でも、CONIN$ はコンソールの入力バッファのハンドルを意味します。標準入力ハンドルを取得するには、GetStdHandle 関数を使います。
 SetStdHandle 関数を使って標準出力ハンドルをリダイレクトした場合でも、CONOUT$ はアクティブな画面バッファのハンドルを意味します。標準出力ハンドルを取得するには、GetStdHandle 関数を使います。
dwDesiredAccessGENERIC_READ | GENERIC_WRITE を指定することを推奨しますが、どちらか一方だけを指定して、アクセスを制限することもできます。
dwShareMode呼び出し側プロセスがコンソールを継承した場合や、子プロセスがコンソールにアクセスできるよう設定する必要がある場合、このパラメータで FILE_SHARE_READ | FILE_SHARE_WRITE を指定しなければなりません。
lpSecurityAttributesコンソールを継承可能にするには、 構造体の bInheritHandle パラメータで TRUE を指定しなければなりません。
dwCreationDispositionコンソールを開く場合は、OPEN_EXISTING を指定するべきです。
dwFlagsAndAttributes無視されます。
hTemplateFile無視されます。

次のリストは、fwdAccess lpFileName のさまざまな設定、およびその効果を示します。

lpFileNamefwdAccess結果
CONGENERIC_READ入力の目的でコンソールを開きます。
CONGENERIC_WRITE出力の目的でコンソールを開きます。
CONGENERIC_READ
GENERIC_WRITE
Windows 95:CreateFile は失敗します。GetLastError は ERROR_PATH_NOT_FOUND を返します。

Windows NT/2000:CreateFile は失敗します。GetLastError は ERROR_FILE_NOT_FOUND を返します。


ディレクトリ

CreateFile 関数を呼び出してディレクトリを作成することはできません。ディレクトリを作成するには、CreateDirectory 関数か、CreateDirectoryEx 関数を使ってください。

Windows NT/2000:FILE_FLAG_BACKUP_SEMANTICS フラグを指定すると、ディレクトリのハンドルを取得できます。特定の Win32 関数で、ファイルハンドルの代わりにディレクトリハンドルを指定することもできます。

NTFS のような特定のファイルシステムは、個別のファイルとディレクトリの圧縮または暗号化をサポートしています。このようなファイルシステムでフォーマットされているボリュームでは、新しいディレクトリは親ディレクトリの圧縮と暗号化の属性を継承します。

CreateFile 関数を使ってファイルの圧縮状態を設定することはできません。ファイルの圧縮状態を設定するには、 関数を使ってください。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

, AllocConsole, , , CreateDirectory, CreateDirectoryEx, , , GetDiskFreeSpace, , GetStdHandle, OpenFile, , ReadFile, , , SetStdHandle, , , , , WriteFile

表示: