3

C ++のWindowsでファイルを非表示/再表示できるようにしたいのですが、他の属性(FILE_ATTRIBUTE_READONLY、FILE_ATTRIBUTE_ARCHIVEなど)の消去が心配でした。

現在のコードは次のとおりです。

//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);
}

それはうまくいくでしょうか?

4

2 に答える 2

9

このテストは機能しません。常に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);
}
于 2012-04-30T17:05:58.340 に答える
3

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

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);
}
于 2012-04-30T16:38:11.923 に答える