Вопрос по filesystems, windows, c++, winapi – Как скрыть / отменить скрытие файла, не стирая другие атрибуты в C ++ в Windows

2

Я хотел бы иметь возможность скрыть / отменить скрытие файла в Windows в C ++, но я был обеспокоен удалением других атрибутов (таких как FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_ARCHIVE, ...).

Вот текущий код:

<code>//Hiding the file
SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN);

// Un-Hiding the file
SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL);
</code>

Это нормально работает для обычных файлов, но удалит ли скрытый файл флаг READONLY, например? Будет ли удаление файла скрывать?

Если да, я планировал сделать что-то вроде этого:

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

Будет ли это работать?

Одна небольшая вещь: не забудьте проверитьGetFileAttributes возвращаемое значение (проверьте, равно ли оноINVALID_FILE_ATTRIBUTES). Bojan Komazec

Ваш Ответ

2   ответа
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);
}
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);
}
Имейте в виду, однако, что такой код, как и все файловые операции, очень подвержен гонкам с другими процессами, обращающимися к тому же файлу.
& Amp; оператор требуется в операторе if ().

Похожие вопросы