Установить атрибут сжатия файла

Я ожидал этот код:

if (!File.Exists(fullFileName))
{
    File.Create(fullFileName);
}

File.SetAttributes(fullFileName, FileAttributes.Compressed);

Чтобы установить этот флаг:

Но это не... Что я делаю не так? Как мне установить этот флаг в файле?


ОБНОВЛЕНИЕ: это говорит в документации

"Невозможно изменить состояние сжатия объекта File с помощью метода SetAttributes".

И, очевидно, это не работает при использовании статических File.SetAttributes либо.

Учитывая это, как это может быть достигнуто?

2 ответа

Вы можете использовать p / invoke для сжатия файлов.

Я сделал себе статическую вспомогательную функцию:

      public static class FileTools
{
  private const int FSCTL_SET_COMPRESSION = 0x9C040;
  private const short COMPRESSION_FORMAT_DEFAULT = 1;

  [DllImport("kernel32.dll", SetLastError = true)]
  private static extern int DeviceIoControl(
      IntPtr hDevice,
      int dwIoControlCode,
      ref short lpInBuffer,
      int nInBufferSize,
      IntPtr lpOutBuffer,
      int nOutBufferSize,
      ref int lpBytesReturned,
      IntPtr lpOverlapped);

  public static bool EnableCompression(IntPtr 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;
  }
}

Что я использую в своем коде, например, с именем файла:

      using (var fileToCompress = File.Open(fileNameToCompress, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
  FileTools.EnableCompression(fileToCompress.Handle);

Атрибуты являются битовой маской.

Попробуй это:

File.SetAttributes(fullFileName,
    File.GetAttributes(fullFileName) | FileAttributes.Compressed);

(Найдено в методе File.SetAttributes под Examples.)

Другие вопросы по тегам