⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 useful.cpp

📁 用Visual C++编写的查看磁盘信息的工具
💻 CPP
字号:
#include "..\stdafx.h"
#include "Useful.h"


typedef BOOL (WINAPI * GetDskFreeSpcEx)(LPCTSTR lpDirectoryName, 
										PULARGE_INTEGER lpFreeBytesAvailableToCaller, 
										PULARGE_INTEGER lpTotalNumberOfBytes, 
										PULARGE_INTEGER lpTotalNumberOfFreeBytes ); 


BOOL GetHDSpace(const CString& DriveLetter, DWORD& nFreeLow, DWORD& nFreeHigh, 
				DWORD& nTotalLow, DWORD& nTotalHigh)
{
	//ASSERT ( pFreeLow != NULL );
	BOOL bRet = FALSE;
	//DWORD freeLow = 0L;
	//TCHAR rootpath[10];
	BOOL bOSR2 = FALSE;
	
	OSVERSIONINFO VersionInfo; 
	VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
	GetVersionEx(&VersionInfo); 

	if( VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_WINDOWS &&
		LOWORD(VersionInfo.dwBuildNumber) > 1000 )
	{
		bOSR2 = TRUE;
	}
	//_stprintf( rootpath, "%c:\\", DriveLetter );
	//OSR2 detected or WINDOWS NT
	if( bOSR2 || (VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_NT) )
	{
		ULARGE_INTEGER bytesAvailToMe;
		ULARGE_INTEGER TotalBytes;
		ULARGE_INTEGER TotalFreeBytes;
		HINSTANCE hLib = ::LoadLibrary( "KERNEL32.DLL" );
		if( hLib )
		{
			GetDskFreeSpcEx pProc;
			pProc = (GetDskFreeSpcEx)::GetProcAddress( hLib, (LPSTR)"GetDiskFreeSpaceExA");
			if( pProc )
			{
				BOOL bRes = pProc( DriveLetter, &bytesAvailToMe, &TotalBytes, &TotalFreeBytes );
				if( bRes )
				{
					//freeLow = bytesAvailToMe.LowPart;
					nFreeLow = bytesAvailToMe.LowPart;
					nFreeHigh = bytesAvailToMe.HighPart;

					nTotalLow = TotalBytes.LowPart;					
					nTotalHigh = TotalBytes.HighPart;

					bRet = TRUE; //success
				}
				else
				{
					DWORD err = GetLastError();
					TRACE( "Error with GetDiskFreeSpaceEx (%ld)\n", err );
				}
			}
			else
			{
				DWORD err = GetLastError();
				TRACE( "Error with GetProcAddress (%ld)\n", err );
			}
			FreeLibrary(hLib);
		}
	}
	else //Windows 95 NOT OSR2
	{
		DWORD sectorPerCluster;
		DWORD bytesPerSector;
		DWORD freeClusters;
		DWORD totalClusters;
		BOOL bRes = ::GetDiskFreeSpace( DriveLetter, &sectorPerCluster,
			&bytesPerSector, &freeClusters, &totalClusters );
		if( bRes )
		{
			nFreeLow = freeClusters * sectorPerCluster * bytesPerSector;
			nTotalLow = totalClusters * sectorPerCluster * bytesPerSector;
			//GetDiskFreeSpace caanot return more than 32 Bits
			nFreeHigh = 0;
			nTotalHigh = 0;
			bRet = TRUE; //success
		}
		else
		{
			DWORD err = GetLastError();
			TRACE( "Error with GetDiskFreeSpace (%ld)\n", err );
		}
	}

	return( bRet );
}

void FormatByteSize(long double ldLength, CString& str)
{
	if (ldLength >= 1024)
	{
		ldLength /= 1024;
		if (ldLength >= 1000)
		{
			ldLength /= 1024;
			if (ldLength >= 1000)
			{
				ldLength /=1024;
				str.Format(_T("%.2f Gb"), ldLength);
			}else
				str.Format(_T("%.2f Mb"), ldLength);	
		}else
			str.Format(_T("%.2f Kb"), ldLength);	
	}else
		str.Format(_T("%.0f byte"), ldLength);
}



void PumpMessages()
{	
	MSG msg;
    // Handle dialog messages
    while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);  
    }
}

CString GetHomeDirectory()
{
	TCHAR sFilename[_MAX_PATH];
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);
	
	CString rVal(CString(sDrive) + CString(sDir));
	int nLen = rVal.GetLength();
	if (rVal.GetAt(nLen-1) != _T('\\'))
		rVal += _T("\\");

	return rVal;
}

static COMCTL32VERSION c_nComCtl32Version = COMCTL32_UNKNOWN;

BOOL IfNewComCtrl32()
{
	// if we don't already know which version, try to find out
	if (c_nComCtl32Version == COMCTL32_UNKNOWN) {
		// have we loaded COMCTL32 yet?
		HMODULE theModule = ::GetModuleHandle("COMCTL32");
		// if so, then we can check for the version
		if (theModule) {
			// InitCommonControlsEx is unique to 4.7 and later
			FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx");
			if (! theProc) {
				// not found, must be 4.00
				c_nComCtl32Version = COMCTL32_400;
			} else {
				// The following symbol are unique to 4.71
				//牋 DllInstall
				//牋 FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
				//牋 FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
				//牋 FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
				//牋 FlatSB_ShowScrollBar
				//牋 _DrawIndirectImageList _DuplicateImageList
				//牋 InitializeFlatSB
				//牋 UninitializeFlatSB
				// we could check for any of these - I chose DllInstallFARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
				if (! theProc) {
					// not found, must be 4.70
					c_nComCtl32Version = COMCTL32_470;
				} else {
					// found, must be 4.71
					c_nComCtl32Version = COMCTL32_471;
				}
			}
		}
	}

	return c_nComCtl32Version> COMCTL32_400;
	
}

BOOL IsFileExist(LPCTSTR strFile)
{
	DWORD Code = GetFileAttributes(strFile); 
	return (Code != -1); 
}

// To be optimized
void StringDeleteFromLeft(CString & string, int len)
{
	int strLen = string.GetLength();
	
	string = string.Right(strLen - len);
}


void StringDeleteFromRight(CString & string, int len)
{
	int strLen = string.GetLength();
	string = string.Left(strLen-len);
}

void FocusFirstChild(CWnd* pWnd)
{
	CWnd* pwndChild = pWnd->GetWindow(GW_CHILD);
	while (pwndChild)
	{
		if (pwndChild->IsWindowEnabled())
		{
			pwndChild->SetFocus();
			return;
		}

		pwndChild = pwndChild->GetNextWindow();
	}		
}

LONG GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
{
	HKEY hkey;
    LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);

    if (retval == ERROR_SUCCESS) {
		long datasize = MAX_PATH;
		TCHAR data[MAX_PATH];
		RegQueryValue(hkey, NULL, data, &datasize);
		lstrcpy(retdata,data);
		RegCloseKey(hkey);
	}

    return retval;
}

void RunApp(LPCTSTR strApp, LPCTSTR strPar)
{
	TCHAR sFilename[_MAX_PATH];
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

	CString rVal(CString(sDrive) + CString(sDir));
	int nLen = rVal.GetLength();
	if (rVal.GetAt(nLen-1) != _T('\\'))
	    rVal += _T("\\");
	rVal += strApp;

	HINSTANCE result = ShellExecute(NULL, _T("open"), rVal, strPar,NULL, 
		SW_SHOWNORMAL);

	// If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) 
	{
		//MessageBox("Error Opening the app..."); 
	}	
}

void GotoURL(LPCTSTR url)
{
    TCHAR key[MAX_PATH + MAX_PATH];

    // First try ShellExecute()
	HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, SW_SHOW);

	// If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) 
	{

        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));

			if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));
                if (pos == NULL) {					// No quotes found
                    pos = strstr(key, _T("%1"));	// Check for %1, without quotes 
                    if (pos == NULL)				// No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';				// Remove the parameter
                }
                else
                    *pos = '\0';					// Remove the parameter

                lstrcat(pos, _T(" "));
                lstrcat(pos, url);
				result = (HINSTANCE) WinExec(key,SW_SHOW);
            }
        }
	}

	if ((UINT)result <= HINSTANCE_ERROR) 
	{
		
    }
}

void AdjustString(CString& str)
{
	int nLength = str.GetLength();

	for (int n=0; n<nLength; n++)
	{
		if (str[n]=='&' && n<nLength-1 && str[n+1]!='&')
		{
			// insert a new &
			str.Insert(n, '&');
			n++;
			nLength++;
		}
	}
}

BOOL IsFolderEmpty(LPCTSTR str)
{
	BOOL bRet = TRUE;
	
	CString strPath(str);
	if (strPath.Right(1)!=_T("\\"))
		strPath += _T("\\");
	CString strCmp(strPath); 
	strCmp += _T("*.*");

	HANDLE hFind;
    WIN32_FIND_DATA fd;

    if ((hFind = ::FindFirstFile ((LPCTSTR) strCmp, &fd)) ==
        INVALID_HANDLE_VALUE) 
	{
		FindClose (hFind);
        return TRUE;
    }

	do {
        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
		{
			strCmp = (LPCTSTR) &fd.cFileName;				
			
            if ((strCmp != ".") && (strCmp != "..")) 
			{
				strCmp = strPath + strCmp;

				bRet = IsFolderEmpty(strCmp);
				break;
            }
        }else
		{
			bRet = FALSE;
			break;
		}
    } while (::FindNextFile (hFind, &fd));

	FindClose (hFind);
	return bRet;    
}

// Check if directory exists 
BOOL IsDirExist(const CString& Name)
{ 
	DWORD Code = GetFileAttributes(Name); 
	return (Code != -1) && (Code & FILE_ATTRIBUTE_DIRECTORY ); 
} 

//-------------------------------------------- 
// Extract file Path name - basically go up one level (search for the first '\' or ':') 
// Helper only
CString ExtractFilePath(const CString& FileName) 
{ 
	CString Path; 
	int i=-1; 
	
	i = FileName.ReverseFind( '\\' ); 
	if (i==-1) 
		i = FileName.ReverseFind( ':' ); 
	if (i>=0) 
		Path = FileName.Left(i); 
	else 
		Path = FileName; 
	
	return Path; 
}

//-------------------------------------------- 
// Create full path weather exists or not 
BOOL CreateFullDir(const CString& Dir) 
{ 
	if (Dir.IsEmpty()) 
		return TRUE; 
	CString Path = ExtractFilePath(Dir); 
	if (Dir.GetLength() < 3 || IsDirExist(Dir) || Path == Dir) 
		return TRUE; // avoid 'xyz:\' problem. 
	CreateFullDir(Path); 
	return CreateDirectory(Dir, NULL); 
} 

BOOL IsRunningNT()
{
	OSVERSIONINFO VersionInfo; 
	VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
	GetVersionEx(&VersionInfo); 

	return (VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_NT);
}

BOOL DeleteAllInDir(LPCTSTR str, LPCTSTR strExcept)
{
	BOOL bError = FALSE; 
	CString strFolder(str);
	if (strFolder.Right(1) != "\\")
		strFolder += "\\";
	CString strFile(strFolder);
	strFile += "*.*";

	HANDLE hFind;
    WIN32_FIND_DATA fd;
	
	if ((hFind = ::FindFirstFile ((LPCTSTR) strFile, &fd)) ==
        INVALID_HANDLE_VALUE) 
	    return 1;

    do {
		if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
		{
			strFile = CString(fd.cFileName);

			if ((strcmp(strFile, ".")!=0) && (strcmp(strFile, "..")!=0)) 
			{
				CString strSubFolder = strFolder + strFile;
				if (!DeleteAllInDir(strSubFolder, strExcept))
					bError = TRUE;
				if (!RemoveDirectory(strSubFolder))
					bError = TRUE;
            }
        }else
		{
			strFile = CString(fd.cFileName);
			
			if (strFile.CompareNoCase(strExcept) != 0)
			{
				if (!DeleteFile(strFolder + strFile))
					bError = TRUE;
			}
		}

    } while (::FindNextFile (hFind, &fd));
	::FindClose (hFind);

	return !bError;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -