ドライブ書き込み可能かどうかを調べる

物理ドライブが書き込み可能かどうか調べる。CD-ROMドライブは常に書き込み不可、SDカードなどはライトプロテクト状態によって結果がする。情報取得にはIOCTL_DISK_IS_WRITABLEを利用する。

依存環境:ATL
#include "atlstr.h"

#include "winioctl.h"


//
//	ディスクに書き込めるかを調べる
//
//nDriveNoは0~の数値で指定
//
//IOCTL_DISK_GET_CACHE_INFORMATIONによりディスク情報を取得する
//
//対応OS:Windows 2000以降
//
bool	GetDiskWriteProtectStatus(int nDriveNo,bool* pbWriteProtected)
{
	DWORD	dwWritten;
	BOOL	ret;
	HANDLE	hDevice;
	TCHAR	pszDevice[256];

	if(pbWriteProtected == NULL)
		return	false;

	::_stprintf_s (pszDevice,256,_T("\\\\.\\PHYSICALDRIVE%d"),nDriveNo);
	hDevice = ::CreateFile(pszDevice,GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);
	if(hDevice == INVALID_HANDLE_VALUE)
		return	false;

	ret = ::DeviceIoControl(hDevice,IOCTL_DISK_IS_WRITABLE,NULL,0,NULL,0,&dwWritten,NULL);
	::CloseHandle(hDevice);
	if(ret == FALSE && GetLastError () != ERROR_WRITE_PROTECT)
		return	false;

	*pbWriteProtected = (ret) ? false : true;

	return	true;
}



void	Test(void)
{
	bool	ret;
	bool	bWriteProtected;

	ret = GetDiskWriteProtectStatus(0,&bWriteProtected);

	if(ret)
	{
		CAtlString	strMessage;

		if(bWriteProtected)
			strMessage += _T("ディスクに書き込みません。\n");
		else
			strMessage += _T("ディスクに書き込めます。\n");

		::MessageBox(NULL,strMessage,_T(""),MB_OK);
	}
	else
		::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード


カテゴリー「システム情報」 のエントリー