我希望能够在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);
}
那会有用吗?
答案 0 :(得分:8)
此测试不起作用,它总是错误的:
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);
}
答案 1 :(得分: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);
}