/*******************************************************************************
*	ファイル名：DiskCheck.cpp
*	用　　　途：ドライブ容量確認用関数実装
*	備　　　考：
*	履　　　歴：
********************************************************************************/

/****************************
*	インクルードファイル	*
****************************/
#include "StdAfx.h"
#include "DiskCheck.h"

/****************************
*		 関数　定義			*
****************************/

/*******************************************************************************
*	関数名：DiskFullCheck()
*	用　途：ディスクの容量オーバーチェック
*	引き数：確認するフォルダパス(NULLの場合、カレントディレクトリ)、
*			制限容量
*	戻り値：失敗もしくはディスクの空きがない場合(TRUE)
*	備　考：
********************************************************************************/
BOOL DiskFullCheck( LPCTSTR szTargetFolder, ULONGLONG ullCheckBytes ) 
{
	BOOL			bSta ;
	BOOL			bRet ;
	ULONGLONG		ullFreeBytesAvailable ;		// 呼び出し側が利用できるバイト数
	ULONGLONG		ullTotalNumberOfBytes ;		// ディスク全体のバイト数
	ULONGLONG		ullTotalNumberOfFreeBytes ;	// ディスク全体の空きバイト数

	bSta = FALSE ;

	bRet = ::GetDiskFreeSpaceEx( szTargetFolder,
								 (PULARGE_INTEGER)&ullFreeBytesAvailable,
								 (PULARGE_INTEGER)&ullTotalNumberOfBytes,
								 (PULARGE_INTEGER)&ullTotalNumberOfFreeBytes ) ;

	if( bRet==FALSE || ullTotalNumberOfFreeBytes<ullCheckBytes ) {
		bSta = TRUE ;
	}

	return bSta ;
}


/*******************************************************************************
*	関数名：DiskFullCheckRate()
*	用　途：ディスクの容量オーバーチェック
*	引き数：確認するフォルダパス(NULLの場合、カレントディレクトリ)、
*			ディスクドライブの空き割合制限値[%]
*	戻り値：失敗もしくはディスクの空きがない場合(TRUE)
*	備　考：
********************************************************************************/
BOOL DiskFullCheckRate( LPCTSTR szTargetFolder, double dRate ) 
{
	BOOL			bSta ;
	BOOL			bRet ;
	ULONGLONG		ullFreeBytesAvailable ;		// 呼び出し側が利用できるバイト数
	ULONGLONG		ullTotalNumberOfBytes ;		// ディスク全体のバイト数
	ULONGLONG		ullTotalNumberOfFreeBytes ;	// ディスク全体の空きバイト数
	ULONGLONG		ullCheckBytes ;

	bSta = FALSE ;

	bRet = ::GetDiskFreeSpaceEx( szTargetFolder,
								 (PULARGE_INTEGER)&ullFreeBytesAvailable,
								 (PULARGE_INTEGER)&ullTotalNumberOfBytes,
								 (PULARGE_INTEGER)&ullTotalNumberOfFreeBytes ) ;

	if ( bRet ) {
		ullCheckBytes	= (ULONGLONG)( ullTotalNumberOfBytes * dRate / 100 + 1 ) ;
		if ( ullTotalNumberOfFreeBytes < ullCheckBytes ) {
			bSta = TRUE ;
		}
	}
	else { 
		bSta = TRUE ;
	}

	return bSta ;
}


/*******************************************************************************
*	関数名：DiskFullCheckStaticAndRate()
*	用　途：ディスクの固定制限容量と割合両方でのオーバーチェック
*	引き数：確認するフォルダパス(NULLの場合、カレントディレクトリ)、
*			制限容量
*			ディスクドライブの空き割合制限値[%]
*	戻り値：失敗もしくはディスクの空きがない場合(TRUE)
*	備　考：固定容量オーバー、空き割合オーバーのいずれかになるとTRUEを返す
********************************************************************************/
BOOL DiskFullCheckStaticAndRate( LPCTSTR szTargetFolder, ULONGLONG ullCheckBytes, double dRate ) 
{
	BOOL			bSta ;
	BOOL			bRet ;
	ULONGLONG		ullFreeBytesAvailable ;		// 呼び出し側が利用できるバイト数
	ULONGLONG		ullTotalNumberOfBytes ;		// ディスク全体のバイト数
	ULONGLONG		ullTotalNumberOfFreeBytes ;	// ディスク全体の空きバイト数
	ULONGLONG		ullRateCheckBytes ;

	bSta = FALSE ;

	bRet = ::GetDiskFreeSpaceEx( szTargetFolder,
								 (PULARGE_INTEGER)&ullFreeBytesAvailable,
								 (PULARGE_INTEGER)&ullTotalNumberOfBytes,
								 (PULARGE_INTEGER)&ullTotalNumberOfFreeBytes ) ;

	if ( bRet ) {
		ullRateCheckBytes	= (ULONGLONG)( ullTotalNumberOfBytes * dRate / 100 + 1 ) ;
		if ( ullTotalNumberOfFreeBytes < ullCheckBytes    || 
			 ullTotalNumberOfFreeBytes < ullRateCheckBytes ) {
			bSta = TRUE ;
		}
	}
	else { 
		bSta = TRUE ;
	}

	return bSta ;
}

