2016-06-14 4 views
0

通常のファイルが1つあれば、それを読み書きすることができます。それから私は、しかし、このファイルがまだファイルハンドラを介して書き込むことができWindowsで属性を読み取り専用に変更した後にファイルを書き込めるのはなぜですか?

enter image description here

を通じて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の

+0

'std :: fstream'と同じ問題がありますか? – jpo38

+1

これについて驚くべきことは何ですか?書き込みアクセスでファイル 'HANDLE'をオープンしました。そして、それがアクセス権が確認された時です。 @ jpo38:C++の標準ライブラリはWindows APIを使って実装されています。もちろん、その動作は同じです。 – IInspectable

+0

@IInspectable、はい、私はそれを理解しています。しかし、その後、私はファイルを読み取り専用に変更します。次に、このファイルに新しいデータを書き込みます。ウィンドウはこの書かれた振る舞いを妨げるべきですか? – zangw

答えて

2

下VS2015でテスト申し訳ありませんが、私は最終的にあなたの意味を取得します。私はあなたが最初にファイルを作成し、プログラムを閉じずに読み取り専用に設定することを話していると思います。 READONLY属性チェックはルーチンCreateFileでのみ発生します。

Windowsカーネルでは、明示的にリフレッシュされない限り、すべてのオブジェクトに一時アクセス権リストが割り当てられます。固定ディスク上の実際のファイルではほとんど起こりません。 NTFSアクセス制御を使用してCreateFileの後にすべての権利を拒否したとしても、プログラムはCreateFileが呼び出されたときと同じように動作します。

結局のところ、あなたのプログラムはファイルに書き込むことができます。READONLYに変更すると、カーネルアクセステーブルを変更せずにディスクに情報を書き込むだけです。

+0

プログラムが実行されている間、 'GetFileAttributes'を通してファイル属性が変更されていることをチェックするのは正しいですか? – zangw

+0

@zangwはい。合ってます。 –

関連する問題