区分挂载的分区是否是移动硬盘并返回最大剩余空间的本地磁盘

来源:互联网 发布:网络迷情金紫阳小说TXT 编辑:程序博客网 时间:2024/06/05 20:52
#include "StdAfx.h"#include "disk_manager.h"#include <WinIoCtl.h> #pragma warning( disable:4786 )#define MIN_FREE_DRIVE_SIZE (1024 * 1024 * 1024) //1Gdisk_manager::disk_manager(void){}disk_manager::~disk_manager(void){}// 优先空间最大的盘(非系统盘优先),失败返回'\0'// 如果minSize为空, 函数不会失败.// 如果minSize不为空, 则如果成功, 返回的盘的size必然>minSizeWCHAR disk_manager::get_max_free_space_disk(ULONGLONG minSize /*= 0*/){WCHARdiskMax = L'\0',// 最大盘diskSecond =L'\0';// 次大盘WCHARbuf[4*26+1] = {0};if (0 != ::GetLogicalDriveStringsW(sizeof(buf), buf)){unsigned __int64first = 0,// 最大空闲空间分区second =0;// 次大空闲空间分区for (WCHAR *p = buf; 0 != *p; p += wcslen(p)+1){if (DRIVE_FIXED == ::GetDriveType(p) && !is_removeble_disk(p)){ULARGE_INTEGER free_bytes = {0};if (::GetDiskFreeSpaceEx(p, &free_bytes, NULL, NULL)){if (free_bytes.QuadPart > first){if (first){second = first;diskSecond = diskMax;}first = free_bytes.QuadPart;diskMax = p[0] & ~0x20;}else if (free_bytes.QuadPart > second){second = free_bytes.QuadPart;diskSecond = p[0] & ~0x20;}}}}if (minSize && (first < minSize)){return 0;}if (diskSecond == 0){return diskMax;}WCHAR temp[MAX_PATH] = L"";if (::GetWindowsDirectory(temp, sizeof(temp))){if ((temp[0] & ~0x20) == diskMax ){if (minSize && (second < minSize)){//尝试返回diskSecond, 但是diskSecond又不满足条件, 只能返回diskMaxreturn diskMax;}return diskSecond;}}}return diskMax;}unsigned __int64 disk_manager::get_available_space(const TCHAR * pszPath){ULARGE_INTEGER free_bytes = {0};if (::GetDiskFreeSpaceEx(pszPath, &free_bytes, NULL, NULL)){return free_bytes.QuadPart;}return 0;}// 是否是移动磁盘bool disk_manager::is_removeble_disk( const TCHAR * pszPath ){HANDLE hDevice;        bool bResult = false;TCHAR szPath[MAX_PATH] = L"\\\\.\\";lstrcat(szPath,pszPath);int nSize = ::lstrlen(szPath);szPath[nSize-1] = '\0';// 打开设备hDevice = ::CreateFile( szPath,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (hDevice == INVALID_HANDLE_VALUE){return FALSE;}STORAGE_PROPERTY_QUERY Query;DWORD dwOutBytes;Query.PropertyId = StorageDeviceProperty;Query.QueryType = PropertyStandardQuery;STORAGE_DEVICE_DESCRIPTOR pDevDesc;pDevDesc.Size = sizeof(STORAGE_DEVICE_DESCRIPTOR);if ( ::DeviceIoControl( hDevice,IOCTL_STORAGE_QUERY_PROPERTY,&Query, sizeof(STORAGE_PROPERTY_QUERY),&pDevDesc, pDevDesc.Size,&dwOutBytes,NULL ) && pDevDesc.BusType == BusTypeUsb ){bResult = true;}return bResult;}unsigned __int64 disk_manager::get_disk_space(const TCHAR * pszPath){ULARGE_INTEGER total_bytes = {0};TCHAR str_temp[MAX_PATH] = {0};if ( pszPath ){StrCpyN(str_temp, pszPath, 2);if( ::GetDiskFreeSpaceEx( str_temp, NULL, &total_bytes, NULL ) ){return total_bytes.QuadPart;}}return 0;}


#ifndef _P2PVOD_STORMNC_DISK_MANAGER_H_#define _P2PVOD_STORMNC_DISK_MANAGER_H_class disk_manager{public:disk_manager(void);~disk_manager(void);public:// 优先空间最大的盘(非系统盘优先),失败返回'\0'// 如果minSize为空, 函数不会失败.// 如果minSize不为空, 则如果成功, 返回的盘的size必然>minSizestatic WCHAR get_max_free_space_disk(ULONGLONG minSize = 0);static unsigned __int64 get_available_space(const TCHAR * pszPath);static bool is_removeble_disk( const TCHAR * pszPath ); // 是否是移动磁盘static unsigned __int64 get_disk_space(const TCHAR * pszPath);};#endif // _P2PVOD_STORMNC_DISK_MANAGER_H_


0 0
原创粉丝点击