ENGLISH page is here.
GET DinopSearchBar
サイト内検索:
HOME
VC++ TIPS
ダウンロード
DinopExifReader
DinopSearchBar
DinopSearchBar mini
DinopTabbingBar
for Firefox
大阪湾の生き物
甲子園浜の自然
甲子園浜の干潟
甲子園浜の水中
甲子園浜の野鳥
近畿の山々
植物図鑑
箕面マップ
水中機材
カメラ
ランキング
望遠鏡の世界
顕微鏡の世界
Googleのすべて
GoogleマップAPI
ニュース
読んだ本
日記
変な料理の作り方
遺伝子操作
論文紹介
デイトレード
自動売買でFX
ネットで小遣い稼ぎ
Solaris
電子工作
その他
問い合わせ
VC++用コード集
大阪湾の生き物
水中用機材
since:2000/11/15
dinopcom@gmail.com
www.dinop.comは
だいのっぷ・どっと・こむ
と読んでください。







« HRESULT型の判定にSUCCEEDEDやFAILEDは使えない(ことがある) | メイン | WAVファイルの再生 »

ディスク容量取得




解説


 Windows95 OSR2以降の場合はGetDiskFreeSpaceExを利用して情報を取得する。それ以前 の場合はGetDiskFreeSpaceを利用する。GetDiskFreeSpaceは大容量ハードディスクや「パス」 には対応していないためWindows95では取得に失敗することもある。そのため公開しておいて 何だがこのソースの使用はあまりお勧めできない。


ソースコード


#include "atlstr.h"

bool	Test()
{
	DWORDLONG	dlAvail;
	DWORDLONG	dlTotal;
	CAtlString	str;

	GetDiskInfo(_T("c:\\"),dlAvail,dlTotal);
	str.Format(_T("%I64d bytes\n%I64d bytes"),dlAvail,dlTotal);
	MessageBox(0,str,_T(""),0);

	return	true;
}


//
//	ディスク空き容量情報取得
//
//Windows95OSR2よりも前のOSではGetDiskFreeSpaceExが使えないため、パスを指定すると
//正しい情報を取得できない
//
bool	GetDiskInfo(LPCTSTR pszPath,DWORDLONG& dlAvail,DWORDLONG& dlTotal)
{
	BOOL			fRet;
	OSVERSIONINFO	info;

	dlAvail = 0;
	dlTotal = 0;

	::ZeroMemory(&info,sizeof(OSVERSIONINFO));
	info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	fRet = ::GetVersionEx(&info);

	if(info.dwPlatformId == VER_PLATFORM_WIN32_NT || (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && LOWORD(info.dwBuildNumber) > 1000))
	{
		//GetDiskFreeSpaceExを使う

		BOOL (WINAPI* pfnGetDiskFreeSpaceEx)(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes);

		HMODULE			hDLL;
		ULARGE_INTEGER	uliFreeBytesAvailable;
		ULARGE_INTEGER	uliTotalNumberOfBytes;
		ULARGE_INTEGER	uliTotalNumberOfFreeBytes;

		hDLL = ::LoadLibrary(_T("Kernel32.dll"));
		if(hDLL == NULL)
			return	false;

		(FARPROC&)pfnGetDiskFreeSpaceEx = ::GetProcAddress(hDLL,"GetDiskFreeSpaceExA");
		if(pfnGetDiskFreeSpaceEx)
			fRet = pfnGetDiskFreeSpaceEx(pszPath,&uliFreeBytesAvailable,&uliTotalNumberOfBytes,&uliTotalNumberOfFreeBytes);
		else
			fRet = FALSE;

		::FreeLibrary(hDLL);

		if(fRet)
		{
			dlAvail = uliFreeBytesAvailable.QuadPart;
			dlTotal = uliTotalNumberOfBytes.QuadPart;
		}
	}
	else
	{
		//GetDiskFreeSpaceを使う

		DWORD	dwSectorsPerCluster;
		DWORD	dwBytesPerSector;
		DWORD	dwNumberOfFreeClusters;
		DWORD	dwTotalNumberOfClusters;

		CAtlString	strPath;

		strPath = pszPath;
		if(strPath.Right(1) == _T("\\"))
		{
			//パスは使えない
			ATLASSERT(0);
			strPath = strPath.Left(strPath.GetLength() - 1);
		}

		fRet = GetDiskFreeSpace(strPath,&dwSectorsPerCluster,&dwBytesPerSector,&dwNumberOfFreeClusters,&dwTotalNumberOfClusters);
		if(fRet)
		{
			dlAvail = dwNumberOfFreeClusters * dwSectorsPerCluster * dwBytesPerSector;
			dlTotal = dwTotalNumberOfClusters * dwSectorsPerCluster * dwBytesPerSector;
		}
	}

	return	fRet ? true : false;
}










Copyright (c) 1999-2007 issei. All rights reserved. (運営者情報