如何在不删除C+中的其他属性的情况下隐藏/取消隐藏文件+;在窗户上 我希望能够在C++中隐藏/隐藏文件,但是我担心删除其他属性(如FieliAtditEdRead,FieleAtditTyAcGivio,…)。

如何在不删除C+中的其他属性的情况下隐藏/取消隐藏文件+;在窗户上 我希望能够在C++中隐藏/隐藏文件,但是我担心删除其他属性(如FieliAtditEdRead,FieleAtditTyAcGivio,…)。,c++,windows,winapi,filesystems,C++,Windows,Winapi,Filesystems,以下是当前代码: //Hiding the file SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN); // Un-Hiding the file SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL); 这对常规文件很好,但是隐藏文件会删除只读标志吗?取消隐藏文件会将其删除吗 如果是,我正计划做这样的事情: //Hiding the file int attr = GetFileAttributes(pat

以下是当前代码:

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

// Un-Hiding the file
SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL);
这对常规文件很好,但是隐藏文件会删除只读标志吗?取消隐藏文件会将其删除吗

如果是,我正计划做这样的事情:

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

这行吗?

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

第二个代码几乎正确,但您遗漏了
~
符号:

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

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

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

一件小事:别忘了检查
GetFileAttributes
返回值(检查它是否等于
无效的文件属性
)。不过,请注意,像所有文件操作一样,这样的代码很容易与访问同一文件的其他进程竞争。if()语句中需要使用&运算符。