예제 #1
0
파일: opstr.cpp 프로젝트: kaka-jeje/zhu
int	GetFolderSize(CString strFolder, BOOL bSubfolders)
{
	// Declare variables
	int iSize = 0;
	CString	strFilePath, sPattern;
	HANDLE hFile;
	WIN32_FIND_DATA FileInformation;

	// Get pattern
	sPattern = strFolder + TEXT("\\*.*");
	hFile = ::FindFirstFile(sPattern, &FileInformation);
	if (hFile != INVALID_HANDLE_VALUE)
	{
		do
		{
			// Is it something else then current folder?
			if (FileInformation.cFileName[0] != TEXT('.'))
			{
				// Set up path
				strFilePath = strFolder + TEXT("\\") + FileInformation.cFileName;

				// Is it a folder?
				if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				{
					// Should we search subdirectories too?
					if (bSubfolders)
					{
						// Search subdirectory
						int iRS = GetFolderSize(strFilePath, bSubfolders);

						// Check result of function
						iSize += iRS;
					}
				}
				else
				{
					// Increase size
					if (FileInformation.nFileSizeHigh > 0)
					{
						iSize += (FileInformation.nFileSizeHigh * MAXDWORD) + 
								 FileInformation.nFileSizeLow;
					}
					else
					{
						iSize += FileInformation.nFileSizeLow;
					}
				}
			}
		} while (::FindNextFile(hFile, &FileInformation) == TRUE);

		// Close handle
		::FindClose(hFile);
	}

	// Return count
	return iSize;
}
예제 #2
0
INT64 GetFolderSize(LPCTSTR szFolder, BOOL bIncludeChild, FolderFilter fn)
{
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind = INVALID_HANDLE_VALUE;

	CString strFolder(szFolder);
	strFolder.Append( _T("\\*") );

	INT64 folderSize = 0;
	hFind = FindFirstFile(strFolder, &FindFileData);
	if (hFind != INVALID_HANDLE_VALUE) 
	{
		printf ("First file name is %s\n", FindFileData.cFileName);
		do 
		{
			printf ("Next file name is %s\n", FindFileData.cFileName);

			if( _tcsicmp(_T("."), FindFileData.cFileName)==0 
				|| _tcsicmp(_T(".."), FindFileData.cFileName)==0 )
			{
				continue;
			}
			if( FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			{
				if( bIncludeChild )
				{
					CString strResult = szFolder;
					LPCTSTR pszResult;
					LPCTSTR pchLast;
					pszResult = strResult;
					pchLast = _tcsdec( pszResult, pszResult+strResult.GetLength() );
					ATLASSERT(pchLast!=NULL);
					if ((*pchLast != _T('\\')) && (*pchLast != _T('/')))
						strResult += _T('\\');
					strResult += FindFileData.cFileName;
					folderSize += GetFolderSize( strResult, bIncludeChild );
				}
			}
			else
			{
				if( !fn || fn(szFolder, FindFileData.cFileName) )
				{
					ULARGE_INTEGER nFileSize;
					nFileSize.LowPart = FindFileData.nFileSizeLow;
					nFileSize.HighPart = FindFileData.nFileSizeHigh;
					folderSize += nFileSize.QuadPart;
				}
			}

		} while (FindNextFile(hFind, &FindFileData) != 0);
		FindClose(hFind);
	}
	return folderSize;
}
예제 #3
0
double FileMisc::GetFolderSize(const TCHAR* szFolder, BOOL bIncludeSubFolders, const TCHAR* szFileMask,
	HANDLE hTerminate, BOOL bProcessMsgLoop)
{
	// if the dir does not exists just return
	if (!FolderExists(szFolder))
	{
		return 0;
	}

	double dSize = 0;

	WIN32_FIND_DATA finfo;
	CString sSearchSpec(szFolder), sFileMask(szFileMask);

	if (sFileMask.IsEmpty())
	{
		sFileMask = "*.*";
	}

	TerminatePath(sSearchSpec);
	sSearchSpec += sFileMask;

	BOOL bStopped = (WaitForSingleObject(hTerminate, 0) == WAIT_OBJECT_0);
	HANDLE h = NULL;

	if (!bStopped && (h = FindFirstFile(sSearchSpec, &finfo)) != INVALID_HANDLE_VALUE)
	{
		do
		{
			if (bProcessMsgLoop)
			{
				Misc::ProcessMsgLoop();
			}

			if (finfo.cFileName[0] != '.')
			{
				if (finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				{
					if (bIncludeSubFolders)
					{
						CString sSubFolder(szFolder);
						sSubFolder += "\\";
						sSubFolder += finfo.cFileName;

						dSize += GetFolderSize(sSubFolder, TRUE, sFileMask, hTerminate, bProcessMsgLoop);
					}
				}
				else
				{
					dSize += (finfo.nFileSizeHigh * ((double)MAXDWORD + 1)) + finfo.nFileSizeLow;
				}
			}

			bStopped = (WaitForSingleObject(hTerminate, 0) == WAIT_OBJECT_0);
		}
		while (!bStopped && FindNextFile(h, &finfo));

		FindClose(h);
	}

	return bStopped ? -1 : dSize;
}
예제 #4
0
BOOL FolderSize::GetFolderSize(LPCTSTR Path, int* folderCount, int* fileCount, ULARGE_INTEGER& folderSize)
{
	
	if(_tcslen(Path) < 4)
		return FALSE;


		//if ((_tcslen(Path) < 4))
		//{
		//	//za cijeli disk

		//	ULARGE_INTEGER ulFreeCaller;
		//	ulFreeCaller.QuadPart = 0;
		//	ULARGE_INTEGER ulTotal;
		//	ulTotal.QuadPart = 0;
		//	ULARGE_INTEGER ulFree;
		//	ulFree.QuadPart = 0;

		//	rc = GetDiskFreeSpaceEx(lpszStartFolder, &ulFreeCaller, &ulTotal, &ulFree);
		//	lpFolderSize->QuadPart = ulTotal.QuadPart - ulFree.QuadPart;
		//	return rc;
		//}

		HANDLE hFF = 0;
		WIN32_FIND_DATA wfd = { 0 };
		TCHAR szPath[2000];
		ULARGE_INTEGER li_total;
		li_total.QuadPart = 0;
		int dwTotalFolderCount = 0;
		int dwTotalFileCount = 0;

		_tcsncpy(szPath, Path, sizeof(szPath)/sizeof(TCHAR)-1);
		_tcscat(szPath, _T("\\*"));
		
		hFF = FindFirstFile(szPath, &wfd);
		
		if (hFF != INVALID_HANDLE_VALUE)
		{
			

			do
			{
				_tcsncpy(szPath, Path, sizeof(szPath)/sizeof(TCHAR)-1);
				_tcscat(szPath, _T("\\"));
				_tcscat(szPath, wfd.cFileName);

				if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				{
					if (_tcscmp(wfd.cFileName, _T(".")) &&
						_tcscmp(wfd.cFileName, _T("..")) 
						)
					{
						// rekurzija ako je direktorij
						
						ULARGE_INTEGER li;
						li.QuadPart = 0;
						int dwFolderCount = 0;
						int dwFileCount = 0;
						GetFolderSize(szPath,&dwFolderCount, &dwFileCount, li);
								
						li_total.QuadPart += li.QuadPart;
						dwTotalFolderCount += dwFolderCount + 1;
						dwTotalFileCount += dwFileCount;
					}
				}
				else
				{
					LARGE_INTEGER li;
					li.HighPart=wfd.nFileSizeHigh;
					li.LowPart=wfd.nFileSizeLow;
					//rc = GetFileSize(szPath, &li);
					
					li_total.QuadPart += li.QuadPart;
					dwTotalFileCount += 1;
				}

			} while (FindNextFile(hFF, &wfd));
		}

		folderSize = li_total;
		if (folderCount)
			*folderCount = dwTotalFolderCount;
		if (fileCount)
			*fileCount = dwTotalFileCount;

	return TRUE;

}