[WinAPI]API 10[ファイルを作成、開く、読み書きし、ファイルサイズを取得する]
20394 ワード
Windowsシステムでは、ファイルの作成とオープンはAPI関数CreateFileを使用しています.CreateFileは異なるパラメータを指定することによって、新しいファイルであることを表しています.既存のファイルを開くか、ファイルを再構築するかなどです.ファイルを読み書きする最も直接的な方法はReadFileとWriteFile関数を使ってもいいし、ファイルのミラーを使ってもいいし、ファイルサイズを取得するにはGet FileSize関数を使ってもいいし、Get FileAttributes Exなどの関数を使ってもいいです.ファイルを読み、ファイルサイズを取得する前に、CreateFileで作成または開くファイルを使用して、ファイルのハンドルを取得します.ファイルの操作では、ファイルのハンドルは重要な概念です.ファイルのハンドルには唯一のファイルが表示されています.ReadFile、WriteFile、Get FileSizeなどの関数はファイルのハンドルをパラメータとして使用しています.ファイルを操作する前に、CreateFileを使ってファイルのハンドルを取得しなければなりません.
(1)CreateFileCreateFileはファイル操作において最も重要な関数である.ほとんどのファイル操作はファイルのハンドルに使う必要があります.CreateFile関数はこれらの操作のためにファイルのハンドルを作ります.CreateFile関数のパラメータが多く、ファイル名、ファイルの共有モード、アクセス方式、操作モード、権限、フラグ、ファイル属性などが複雑です.各パラメータは、複数の値が選択可能であり、異なる意味を表しています.
◇パラメータlp FileName:パラメータを入力し、対象ファイルの相対パスまたは絶対パスを操作します.dwDesiredAccess:パラメータを入力し、ファイルオブジェクトに対する操作アクセス方式を指定します.READは、ファイルを読む必要があるという意味です.GENERIC_でいいですWRITEは、ファイルを書く必要があるという意味です.GENERIC_でもいいですREADGENERIC_WRITEは、読むことも書くこともできるという意味です.dwShareMode:パラメータを入力し、共有モードです.このファイルは他のプロセスと共有されているかどうかを指定します.共有読み取り、共有書き込み、共有削除(FILESHITE.READ)ができます.複数の属性を指定する場合は、「ビットと‘I’演算」を使用します.上記のパラメータを指定すると、他のプロセスはファイルに関連した操作ができます.本プロセスが本ファイルを独占する必要がある場合、本パラメータは0に設定されます.lp Security Attributes:SECURITY_を指します.ATTRIBUTES構造の指針は、本ファイルのハンドルの安全性を表し、布団の引継ぎなどの操作に影響を与える.NULLに設定すると、サブプロセスはこのハンドルを引き継ぐことができません.SECURITY ATTRIBUTES構造は一般的ではないので、このデータ構造の設定は、Windowsシステムにおける権限管理の原理に関するものであり、本章では詳細に説明しない.dwCreationDispation:パラメータを入力して、動作モードです.
dwFlags AndAttributes:パラメータ、ファイル属性、ファイルフラグを入力します.
一般的にはファイルの属性がよく使われていますが、操作フラグは一般的ではなく、「1」演算子を使って複数の属性とフラグを指定することができます.hTemplateFile:パラメータを入力し、アクセス権限がGENERIC(u)を含む場合WRITEの場合は、テンプレートファイルのハンドルに設定できます.一般的にはNULLに設定でき、テンプレートファイルを使用しないことを示しています.◇値はHANDLEデータタイプ値に戻り、ファイルのハンドルを表し、INVAILID_に戻るとHANDLE_VALEは、操作が失敗したことを示します.
(2)ReadFile.ReadFile運動エネルギーはファイルからデータを読み出す.CreateFileで返されたファイルのハンドルが必要です.
◇パラメータhFile:パラメータを入力し、データを読み込むファイルオブジェクトは、CreateFileから作成し、CreateFileを呼び出してファイルを開く時はGENERIC_を指定する必要があります.READ読み出し動作モード.lpBuffer:パラメータを入力して、ファイルデータを読み込むメモリバッファを指します.nnnumber OfBytes ToRead:パラメータを入力して、ファイルから読み出したいデータのサイズを指定して、lpBufferメモリブロックのサイズより大きくしてはいけません.さもなければオーバーフローを引き起こします.lpnumber OfBytes Read:出力パラメータは、実際に読み出したデータサイズを記憶するDWORD変数を指します.ファイルを読んでいる場合、ファイルの最後に到達しているなどの理由で、その値はrtNumber OfBytes ToReadより小さいかもしれません.lpOverlappedがNULLである場合、このパラメータはNULLではない.lpOverlapped:パラメータを入力し、OVERLAPPED構造体へのポインタを指し、CreateFileを呼び出すとFILE_uが設定されています.FLAG_OVERLAPPEDフラグは、このパラメータを使用する必要があり、そうでなければNULLとすることができる.◇値を返してBOOL値を返し、ファイルの読み込みが成功したかどうかを示します.◇説明書を使って読んでいる間に、ファイルポインタは読み取り操作に従って自動的に移動します.この関数を循環して呼び出した時に、ファイルの内容を順次読み出します.もしプログラムが失敗したら、GetLastErr関数を使ってエラー情報を取得することができます.
(3)WriteFile.WriteFile関数の機能は、データをファイルに書き込み、ファイルポインタの位置に書き込み、書き込みが完了するとファイルポインタが書き込みのデータに移動します.
◇パラメータhFile:パラメータを入力し、データを書き込むファイルオブジェクトは、CreateFileから作成し、CreateFileを呼び出してファイルを開く場合、GENERIC_を指定する必要があります.WRITE読出し動作モードです.lpBuffer:パラメータを入力して、ファイルデータを書き込みたいメモリバッファを指します.nNumber OBytes ToWrite:パラメータを入力し、ファイルに書き込むデータのサイズを指定します.lpnumberOiBytes Written:出力パラメータは、実際に書き込まれたデータサイズを格納する変数を指しています.ファイルの最後に到達しているなどの理由で、その値はnNumberOfBytes ToWriteとは異なるかもしれません.lpOverlappedがNULLである場合、このパラメータはNULLではない.lpOverlapped:パラメータを入力し、OVERLAPPED構造体へのポインタを指し、CreateFileを呼び出すとFILE_uが設定されています.FLAG_OVERIAPPEDフラグは、このパラメータを使用する必要があります.NULLでいいです.◇値を返してBOOL値を返し、文書の作成が成功したかどうかを示します.◇使用説明
読んでいる間、ファイルポインタは書き込み操作に従って移動します.この関数を循環的に起動すると、ファイルの内容は順番に書き込みます.プログラムが失敗したら、GetLastErr関数を使ってエラー情報を取得できます.
(4)Get FileSize、Get FileSize EX.Get FileSize、Get FileSizEXの機能は一致しています.ファイルサイズを取得することです.
◇パラメータGetFileSizeのパラメータは以下の通りです.hFile:パラメータを入力し、データを読み込むファイルオブジェクトは、CreateFileから作成され、CreateFileを呼び出してファイルを開く時にGENERIC_を指定する必要があります.READ読み出し動作モードまたはGENERIC_WRITE書込み動作モードです.lpFileSizeHigh:出力パラメータは、得られたファイルサイズの高い32ビットを表します.このパラメータはNULLであり、NULLの場合はファイルサイズをDWORDで表すことができます.具体的には戻り値を参照してください.Get FileSizeExのパラメータは以下の通りです.hFile:パラメータを入力し、データを読み込むファイルオブジェクトは、CreateFileから作成され、CreateFileを呼び出してファイルを開く場合は、GENERIC_を指定する必要があります.READ読み出し動作モードまたはGENERIC_WRITE書込み動作モードです.lpFileSize:出力パラメータは、ファイルサイズを格納するLARGE_uを指します.INTEGER連合体は、LARGEE.1 NTEGGER構造に関する内容を先に紹介しました.API 9小節のキーデータ構造部分を参照してください.◇戻り値GetFileSizeに成功した場合、戻り値はファイルサイズDWORD値を表します.Get FileSizeが失敗した場合、lp FileSizeHighがNULLであれば、INVAL_に戻ります.FILE_SIZEは、GetLastError関数を呼び出して、より詳細なエラー情報を取得することができます.lp FileSizeHighがNULLでない場合、同じINVAILID_に戻ります.FILE_SIZEは、lpFileSizeHighが指す値を高32ビットに読み返してみて、戻りの低い32ビットDWORDと連結して64ビットの値としてファイルサイズを表します.lp FileSizeHighが適法値であればGetLastErrはNo_に戻る.ERRORは、APIが依然として成功していることを示している.そうでなければ、GetLastErrはNO_に等しくないです.ERRORの値
Get FileSizeExは直接BOOL値に戻り、ファイルの読み取りが成功したかどうかを示します.
◇使用説明実際のこの二つの関数の違いは、ファイルサイズがDWORDを超えている場合に異なる処理をすることです.歴史的な理由により、GetFileSizeは2つの32ビットの値でそれぞれ64ビットのファイルサイズの上位と位置を格納する.Get FileSizeExは、ファイルサイズを64ビットの共同体に直接保存します.
>>本例では、CreateFile、ReadFile、WriteFileを使用して、ファイルの作成、開封、読み書きを行う機能があります.筆者は実例の中で自分でSaveData ToFile関数を作成してDディスクのルートディレクトリの下でショー.txtを作成してファイルにデータを書き込み、ReadFileConteet関数を作成してファイルの内容を読み取る.
1 #include <Windows.h>
2 #include <stdio.h>
3
4 DWORD ReadFileContent(LPSTR szFilePath)
5 {
6 //
7 HANDLE hFileRead;
8 //
9 LARGE_INTEGER liFileSize;
10 //
11 DWORD dwReadedSize;
12 //
13 LONGLONG liTotalRead=0;
14 //
15 BYTE lpFileDataBuffer[32];
16
17 // ,
18 hFileRead = CreateFileA(szFilePath,//name
19 GENERIC_READ, //
20 FILE_SHARE_READ, //
21 NULL, //
22 OPEN_EXISTING, //
23 FILE_ATTRIBUTE_NORMAL, //
24 NULL); //
25 //
26 if(hFileRead==INVALID_HANDLE_VALUE)
27 {
28 printf(" : %d",GetLastError());
29 }
30 if(!GetFileSizeEx(hFileRead,&liFileSize))
31 {
32 printf(" : %d",GetLastError());
33 }
34 else
35 {
36 printf(" : %d
",liFileSize.QuadPart);
37 }
38 //
39 while(TRUE)
40 {
41 DWORD i;
42 if(!ReadFile(hFileRead,//
43 lpFileDataBuffer, //
44 32, // ( )
45 &dwReadedSize, //
46 NULL)) // Overlapped
47 {
48 printf(" : %d
",GetLastError());
49 break;
50 }
51 printf(" %d , : ",dwReadedSize);
52
53 for(i=0;i<dwReadedSize;i++)
54 {
55 printf("0x%x ",lpFileDataBuffer[i]);
56 }
57 printf("
");
58 liTotalRead+=dwReadedSize;
59 if(liTotalRead==liFileSize.QuadPart)
60 {
61 printf("
");
62 break;
63 }
64 }
65 CloseHandle(hFileRead);
66 return 0;
67 }
68
69 DWORD SaveDataToFile(
70 LPSTR szFilePath,
71 LPVOID lpData,
72 DWORD dwDataSize)
73 {
74 //
75 HANDLE hFileWrite;
76 //
77 DWORD dwWritedDateSize;
78 // ,
79 hFileWrite=CreateFileA(szFilePath,//
80 GENERIC_WRITE,//
81 0,//
82 NULL,//
83 OPEN_ALWAYS,//
84 FILE_ATTRIBUTE_NORMAL,//
85 NULL);//
86 //
87 if(hFileWrite==INVALID_HANDLE_VALUE)
88 {
89 printf(" : %d
",GetLastError());
90 }
91 //
92 SetFilePointer(hFileWrite,0,0,FILE_END);
93 //
94 if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL))
95 {
96 printf(" : %d
",GetLastError());
97 }
98 else
99 {
100 printf(" , %d 。
",dwWritedDateSize);
101 }
102 CloseHandle(hFileWrite);
103 return 0;
104 }
105 int main()
106 {
107 LPSTR szFileData=" ";
108 SaveDataToFile("D:\\show.txt",szFileData,lstrlenA(szFileData));
109 ReadFileContent("D:\\show.txt");
110 return 0;
111 }