如何隐藏/取消隐藏文件而不删除Windows上的C++中的其他属性

nba*_*lle 2 c++ windows filesystems winapi

我希望能够在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);
Run Code Online (Sandbox Code Playgroud)

这适用于常规文件,但是隐藏文件会删除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);
}
Run Code Online (Sandbox Code Playgroud)

那会有用吗?

Ben*_*igt 8

这个测试不起作用,总是假的:

if ((attr | FILE_ATTRIBUTE_HIDDEN) == 0)
Run Code Online (Sandbox Code Playgroud)

它应该说

if ((attr & FILE_ATTRIBUTE_HIDDEN) == 0)
Run Code Online (Sandbox Code Playgroud)

同样,要测试文件是否已被隐藏:

if ((attr & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN)
Run Code Online (Sandbox Code Playgroud)

最终更正的代码:

//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);
}
Run Code Online (Sandbox Code Playgroud)