通常のファイルが1つあれば、それを読み書きすることができます。それから私は、しかし、このファイルがまだファイルハンドラを介して書き込むことができWindowsで属性を読み取り専用に変更した後にファイルを書き込めるのはなぜですか?
を通じてRead-only
にこのファイルの属性を変更します。ここに私のコード
#define CREATE_FILE_OPT FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_RANDOM_ACCESS
std::string name("test.txt");
HANDLE hfile = ::CreateFile(name.c_str(),
GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, CREATE_FILE_OPT, NULL);
if (hfile == INVALID_HANDLE_VALUE) {
hfile = ::CreateFile(name.c_str(),
GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_NEW, CREATE_FILE_OPT, NULL);
if (hfile == INVALID_HANDLE_VALUE) {
printf("so sad, invalid file handler....");
return -1;
}
}
int i = 0;
char rbuf[] = "you are";
DWORD bytesWritten;
do {
Sleep(5000);
++i;
bytesWritten = 0;
BOOL bret = ::WriteFile(hfile, rbuf, strlen(rbuf), &bytesWritten, NULL);
if (bret == FALSE) {
printf("Cannot write bytes into file.....");
DWORD err = GetLastError();
printf("The error code is %d\n", err);
}
else
printf("write %d bytes to file\n", bytesWritten);
DWORD ret = GetFileAttributes(name.c_str());
printf("The file attribute is %d\n", ret);
} while (i < 10000);
私はRead-only
にそれを変更する前に、ファイルの属性が32
ではありますが、このファイルはRead-only
された後、それは33
になります。
私はファイルがRead-only
に変更した後に書き込める理由を知りたいのですが?テストコードに問題はありますか?
PSは:Windows 7の
'std :: fstream'と同じ問題がありますか? – jpo38
これについて驚くべきことは何ですか?書き込みアクセスでファイル 'HANDLE'をオープンしました。そして、それがアクセス権が確認された時です。 @ jpo38:C++の標準ライブラリはWindows APIを使って実装されています。もちろん、その動作は同じです。 – IInspectable
@IInspectable、はい、私はそれを理解しています。しかし、その後、私はファイルを読み取り専用に変更します。次に、このファイルに新しいデータを書き込みます。ウィンドウはこの書かれた振る舞いを妨げるべきですか? – zangw