2012-04-30 1 views
2

WindowsでC++でファイルを非表示/非表示にしたいのですが、FILE_ATTRIBUTE_READONLY 、FILE_ATTRIBUTE_ARCHIVE、...)。ここでWindows上のC++で他の属性を消去しないでファイルを非表示/非表示にする方法

は、現在のコードです:

//Hiding the file 
SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN); 

// Un-Hiding the file 
SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL); 

これは、通常のファイルに対しては正常に動作しますが、ファイルを非表示にすると、例えばREADONLYフラグを削除しますか?ファイルを隠すと削除されますか?

そうならば、私はこのような何かを行う上で計画していた:

//Hiding the file 
int attr = GetFileAttributes(path); 
if ((attr | FILE_ATTRIBUTE_HIDDEN) == 0) { 
    SetFileAttributes(path, attr & FILE_ATTRIBUTE_HIDDEN); 
} 

//Unhiding the file 
int attr = GetFileAttributes(path); 
if ((attr | FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN) { 
    SetFileAttributes(path, attr & FILE_ATTRIBUTE_HIDDEN); 
} 

は、その仕事がしませんか?

+2

一つのマイナーなもの:(それは 'INVALID_FILE_ATTRIBUTES'に等しいかどうかを確認してください)' GetFileAttributes'の戻り値をチェックすることを忘れないでください。 –

答えて

8

、それは常にfalseになります。

if ((attr | FILE_ATTRIBUTE_HIDDEN) == 0) 

それは代わりに言うべき

if ((attr & FILE_ATTRIBUTE_HIDDEN) == 0) 

同様に、ファイルが既に隠されているかどうかをテストするには、

if ((attr & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN) 

最終的な補正コード:

//Hiding the file 
int attr = GetFileAttributes(path); 
if ((attr & FILE_ATTRIBUTE_HIDDEN) == 0) { 
    SetFileAttributes(path, attr | FILE_ATTRIBUTE_HIDDEN); 
} 

//Unhiding the file 
int attr = GetFileAttributes(path); 
if ((attr & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN) { 
    SetFileAttributes(path, attr & ~FILE_ATTRIBUTE_HIDDEN); 
} 
2

はい、最初のコードは他のすべての属性を削除します。

第二のコードはほとんど正しいですが、あなたが見逃している~シンボル:このテストでは動作しません

// Hiding the file 

int attr = GetFileAttributes(path); 

if ((attr & FILE_ATTRIBUTE_HIDDEN) == 0) { 
    SetFileAttributes(path, attr | FILE_ATTRIBUTE_HIDDEN); 
} 

// Unhiding the file 

int attr = GetFileAttributes(path); 

// Is it currently visible? 
if ((attr & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN) { 
    SetFileAttributes(path, attr & ~FILE_ATTRIBUTE_HIDDEN); 
} 
+0

このようなコードは、すべてのファイル操作と同じファイルにアクセスする他のプロセスと競合する傾向があります。 – ltjax

+1

if演算子は必須です。 –

関連する問題