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

这个测试不起作用,它总是错误的:

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

是的,第一个代码将删除所有其他属性。

第二个代码几乎是正确的,但是您错过了~符号:

// 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 回答