如何隐藏/取消隐藏文件,而不删除Windows上的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); } 

这会工作吗?

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

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

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

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

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