You can use DeviceIoControl interop:
internal static class NativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DeviceIoControl(
SafeFileHandle hDevice,
int dwIoControlCode,
ref short lpInBuffer,
int nInBufferSize,
IntPtr lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
}
public class SomeClass {
public static void SetCompressionAttribute(string output)
{
using (FileStream outputStream = File.Create(output))
{
// Write to file
// Setting compression flag
const int SetCompressionCode = 0x9C040;
const short CompressionFormatDefault = 1;
int bytesReturned = 0;
short inputBuffer = CompressionFormatDefault;
int result = NativeMethods.DeviceIoControl(
outputStream.SafeFileHandle,
SetCompressionCode,
ref inputBuffer,
sizeof(short),
IntPtr.Zero,
0,
ref bytesReturned,
IntPtr.Zero);
if (result == 0)
{
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
}
}
}
}