Установка атрибутов папки сжатый или зашифрованный.

  • Автор темы Indahaus
  • Дата начала
I

Indahaus

#1
Весь инет перерыл ничего толком не нашёл, как установить именно папку сжатой или зашифрованной и наоборот.
SetFileAttributes("C:\\Test", FILE_ATTRIBUTE_NORMAL); // устанавливает только как обычную не скрытую и не системную папку. А типы "сжатый" или "зашифрованный" вообще не трогает.

Пытался сделать так:
C++:
HANDLE hFile=NULL;
unsigned int iCompression=0; // для сжатого файла, т.е. сбросить тип сжатый. 

hFile = CreateFile("C:\\Test", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); 
if (INVALID_HANDLE_VALUE == hFile) {
return false;
}

if (iCompress == 1) {
iCompression = COMPRESSION_FORMAT_DEFAULT;
} else {
iCompression = COMPRESSION_FORMAT_NONE;
}
DWORD dw=0;
if (FALSE == DeviceIoControl(hFile, FSCTL_SET_COMPRESSION, &iCompression, sizeof(unsigned int), NULL, 0, &dw, NULL)) {
CloseHandle(hFile);
hFile = NULL;
return false;
}
CloseHandle(hFile);
hFile = NULL;
return true;
но действует только на файлы! а на папки не действует вообще.
Как получить дескриптор папки от CreateFile или хотя бы с помощью другой функции? или можно как-то другим способом сделать?

Также и шифрование и дешифрование соответственно функции EncryptFile и DecryptFile - только для файлов, а на папки вообще не действует. Помогите пожалуйста.
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Вообщем то бы тебе дескриптор папки получить, то нужно юзать CreateFile с флагом FILE_FLAG_BACKUP_SEMANTICS, это одна из его малодокументированных функций..

Добавлено: Примерно так: HANDLE F = CreateFileA("debug", GENERIC_READ, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
Таким образом реализуется запрет на совместное использование папки несколькими программами, пока данный процесс не завершится (за это отвечает dwShareMode = 0), без использования FILE_FLAG_BACKUP_SEMANTICS ничего не выйдет и сам дескриптор (хандл) будет равен скорее всего 0xFFFFFFFF