using System;
using System.IO;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 장치 IO 제어하기 - DeviceIoControl(deviceHandle, ioControlCode, inBuffer, inBufferSize, outBuffer, outBufferSize, byteCountReturned, overlappedHandle)
/// <summary>
/// 장치 IO 제어하기
/// </summary>
/// <param name="deviceHandle">디바이스 핸들</param>
/// <param name="ioControlCode">IO 제어 코드</param>
/// <param name="inBuffer">입력 버퍼</param>
/// <param name="inBufferSize">입력 버퍼 크기</param>
/// <param name="outBuffer">출력 버퍼</param>
/// <param name="outBufferSize">출력 버퍼 크기</param>
/// <param name="byteCountReturned">반환 바이트 수</param>
/// <param name="overlappedHandle">중첩 핸들</param>
/// <returns>처리 결과</returns>
[DllImport("kernel32")]
public static extern bool DeviceIoControl
(
IntPtr deviceHandle,
uint ioControlCode,
ref short inBuffer,
uint inBufferSize,
IntPtr outBuffer,
uint outBufferSize,
ref uint byteCountReturned,
IntPtr overlappedHandle
);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// FSCTL_SET_COMPRESSION
/// </summary>
private const uint FSCTL_SET_COMPRESSION = 0x0009C040;
/// <summary>
/// COMPRESSION_FORMAT_NONE
/// </summary>
private const short COMPRESSION_FORMAT_NONE = 0;
/// <summary>
/// COMPRESSION_FORMAT_DEFAULT
/// </summary>
private const short COMPRESSION_FORMAT_DEFAULT = 1;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 파일 스트림 열기 - OpenFileStream(filePath)
/// <summary>
/// 파일 스트림 열기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>파일 스트림</returns>
private static FileStream OpenFileStream(string filePath)
{
return File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
#endregion
#region 압축 설정하기 - SetCompression(handle, compression)
/// <summary>
/// 압축 설정하기
/// </summary>
/// <param name="handle">핸들</param>
/// <param name="compression">압축</param>
/// <returns>처리 결과</returns>
private static bool SetCompression(IntPtr handle, short compression)
{
uint byteCountReturned = 0;
return DeviceIoControl(handle, FSCTL_SET_COMPRESSION, ref compression, 2, IntPtr.Zero, 0, ref byteCountReturned, IntPtr.Zero);
}
#endregion
#region 압축 설정하기 - SetCompression(filePath)
/// <summary>
/// 압축 설정하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>처리 결과</returns>
private static bool SetCompression(string filePath)
{
using(FileStream fileStream = OpenFileStream(filePath))
{
return SetCompression(fileStream.Handle, COMPRESSION_FORMAT_DEFAULT);
}
}
#endregion
#region 압축 취소하기 - CancelCompression(filePath)
/// <summary>
/// 압축 취소하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>처리 결과</returns>
private static bool CancelCompression(string filePath)
{
using(FileStream fileStream = OpenFileStream(filePath))
{
return SetCompression(fileStream.Handle, COMPRESSION_FORMAT_NONE);
}
}
#endregion
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
string path = @"d:\sample.txt";
Console.WriteLine("파일 압축을 설정하기 위해서 아무 키나 눌러 주시기 바랍니다.");
Console.ReadKey(true);
if(SetCompression(path))
{
Console.WriteLine("파일 압축을 설정했습니다.");
}
else
{
Console.WriteLine("파일 압축 설정을 실패했습니다.");
}
Console.WriteLine("파일 압축을 취소하기 위해서 아무 키나 눌러 주시기 바랍니다.");
Console.ReadKey(true);
if(CancelCompression(path))
{
Console.WriteLine("파일 압축을 취소했습니다.");
}
else
{
Console.WriteLine("파일 압축 취소를 실패했습니다.");
}
Console.ReadKey(true);
}
#endregion
}
}