文件和文件夾設(shè)置和解除壓縮屬性的方法是一樣的劳曹,這是 NTFS 分區(qū)的功能臊泰,文件如果設(shè)置了壓縮屬性舞骆,采用 LZNT1 壓縮算法來(lái)減少磁盤的占用空間曹步。
- 如果文件夾設(shè)置了壓縮屬性,并不影響這個(gè)文件夾里面原有的文件魔市,以后在這個(gè)文件夾里面新創(chuàng)建的文件是壓縮的主届;
- 如果文件夾解除了壓縮屬性,并不影響這個(gè)文件夾里面原有的文件待德,以后在這個(gè)文件夾里面新創(chuàng)建的文件不壓縮了君丁,恢復(fù)正常;
- 如果文件設(shè)置了壓縮屬性将宪,會(huì)采用 LZNT1 壓縮算法減少占用的磁盤空間绘闷;
- 如果文件解除了壓縮屬性,文件會(huì)解壓縮较坛,恢復(fù)正常的占用磁盤空間簸喂。
如果要設(shè)置或解除壓縮屬性,需要用 CreateFile 打開(kāi)文件或文件夾燎潮,必須包含 FILE_FLAG_BACKUP_SEMANTICS 參數(shù);然后用 DeviceIoControl 設(shè)置或解除壓縮屬性扼倘,使用 FSCTL_SET_COMPRESSION 參數(shù)确封。
需要包含的頭文件:
#include <WinIoCtl.h>
示例代碼:
- 函數(shù) GetErrMsg 把 GetLastError 返回的錯(cuò)誤碼轉(zhuǎn)成可讀的錯(cuò)誤信息;
- 函數(shù) SetFileCompression 壓縮或解除壓縮一個(gè)文件或文件夾再菊;
- 點(diǎn)擊 Button1 獲取編輯框 Edit1 里面的文件是否有壓縮屬性爪喘;
- 點(diǎn)擊 Button2 把 Edit1 里面的文件設(shè)置壓縮屬性;
- 點(diǎn)擊 Button3 把 Edit1 里面的文件解除壓縮屬性纠拔。
UnicodeString GetErrMsg(DWORD dwErrNo)
{
UnicodeString sErrMsg;
wchar_t *lpwsMsg = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrNo, 0, (wchar_t*)&lpwsMsg, 0, NULL);
if(lpwsMsg)
{
sErrMsg = lpwsMsg;
LocalFree(lpwsMsg);
}
return sErrMsg;
}
//---------------------------------------------------------------------------
bool SetFileCompression(UnicodeString sPathName, bool bCompress, UnicodeString &sErrMsg)
{
bool bOK = false;
HANDLE hFolder = CreateFile(sPathName.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if(hFolder!=INVALID_HANDLE_VALUE)
{
USHORT uNewState = bCompress ? COMPRESSION_FORMAT_DEFAULT : COMPRESSION_FORMAT_NONE;
DWORD dwBytesReturned = 0;
bOK = DeviceIoControl(hFolder, FSCTL_SET_COMPRESSION, &uNewState, sizeof(uNewState), NULL, 0, &dwBytesReturned, NULL) != 0;
if(!bOK)
{
DWORD dwErrCode = GetLastError();
sErrMsg = GetErrMsg(dwErrCode);
}
CloseHandle(hFolder);
}
else
{
DWORD dwErrCode = GetLastError();
sErrMsg = GetErrMsg(dwErrCode);
}
return bOK;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString sPathName = Edit1->Text;
DWORD dwAttr = GetFileAttributes(sPathName.c_str());
if(dwAttr != INVALID_FILE_ATTRIBUTES)
{
if((dwAttr & FILE_ATTRIBUTE_COMPRESSED) != 0)
{
ShowMessage(L"文件/文件夾已經(jīng)壓縮:\r\n" + sPathName);
}
else
{
ShowMessage(L"文件/文件夾沒(méi)有壓縮:\r\n" + sPathName);
}
}
else
{
DWORD dwErrCode = GetLastError();
UnicodeString sErrMsg = GetErrMsg(dwErrCode);
ShowMessage(L"錯(cuò)誤:" + sErrMsg);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
UnicodeString sPathName = Edit1->Text;
UnicodeString sErrMsg;
if(SetFileCompression(sPathName, true, sErrMsg))
{
ShowMessage(L"設(shè)置壓縮屬性成功:\r\n" + sPathName);
}
else
{
ShowMessage(sErrMsg);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
UnicodeString sPathName = Edit1->Text;
UnicodeString sErrMsg;
if(SetFileCompression(sPathName, false, sErrMsg))
{
ShowMessage(L"解除壓縮屬性成功:\r\n" + sPathName);
}
else
{
ShowMessage(sErrMsg);
}
}
//---------------------------------------------------------------------------
運(yùn)行結(jié)果:
設(shè)置和解除壓縮屬性