Установить атрибут сжатия файла
Я ожидал этот код:
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
.)