How to hide/un-hide a file without erasing other attributes in C++ on Windows
c++, filesystems, winapi, windows
Solution
This test won't work, it will always be false:
if ((attr | FILE_ATTRIBUTE_HIDDEN) == 0)
It should instead say
if ((attr & FILE_ATTRIBUTE_HIDDEN) == 0)
Similarly, to test if a file is already hidden:
if ((attr & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN)
Final corrected code:
//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);
}
Problem
I would like to be able to hide/un-hide a file in Windows in C++, but I was concerned about erasing other attributes (like FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE, ...). Here is the current code: ``` //Hiding the file SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN); // Un-Hiding the file SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL); ``` This works fine for regular files, but will hiding the file remove a READONLY flag for example? Will unhiding the file remove it? If yes, I was planning on doing something like this: ``` //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); } ``` Would that work?