По моему опыту, использование P / Invoke обычно проще, чем WMI. Я считаю, что должно работать следующее:
private const int FSCTL_SET_COMPRESSION = 0x9C040;
private const short COMPRESSION_FORMAT_DEFAULT = 1;
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int DeviceIoControl(
SafeFileHandle hDevice,
int dwIoControlCode,
ref short lpInBuffer,
int nInBufferSize,
IntPtr lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
public static bool EnableCompression(SafeFileHandle handle)
{
int lpBytesReturned = 0;
short lpInBuffer = COMPRESSION_FORMAT_DEFAULT;
return DeviceIoControl(handle, FSCTL_SET_COMPRESSION,
ref lpInBuffer, sizeof(short), IntPtr.Zero, 0,
ref lpBytesReturned, IntPtr.Zero) != 0;
}
Поскольку вы пытаетесь установить это для каталога, вам, вероятно, потребуется использовать P / Invoke для вызова CreateFile , используя FILE_FLAG_BACKUP_SEMANTICS
, чтобы получить SafeFileHandle для каталога.
Кроме того, обратите внимание, что установка сжатия для каталога в NTFS не сжимает все содержимое, она только заставляет новые файлы отображаться как сжатые (то же самое относится и к шифрованию). Если вы хотите сжать весь каталог, вам нужно пройти по всему каталогу и вызвать DeviceIoControl для каждого файла / папки.