【问题标题】:How to hide/un-hide a file without erasing other attributes in C++ on Windows如何在 Windows 上隐藏/取消隐藏文件而不删除 C++ 中的其他属性
【发布时间】:2012-04-30 16:31:06
【问题描述】:

我希望能够在 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);
}

这行得通吗?

【问题讨论】:

  • 一件小事:别忘了检查GetFileAttributes返回值(检查它是否等于INVALID_FILE_ATTRIBUTES)。

标签: c++ windows winapi filesystems


【解决方案1】:

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

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

    • 但是请注意,像这样的代码,作为所有文件操作,很容易与访问同一文件的其他进程发生竞争条件..
    • if() 语句中需要 & 运算符。
    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2015-09-30
    • 2021-07-12
    • 2018-10-18
    相关资源
    最近更新 更多