全盤文件搜索

老羅win32彙編例子修改

 

 

#include <windows.h>
#include <process.h>
//#include <objidl.h>
#include "resource.h"
#include "FindFile.h"
#include "BrowseFolder.h"

BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void ProcThread (PVOID pvoid);

HWND hWinMain;
TCHAR	szPath[MAX_PATH];
TCHAR	szSearchInfo[] = L"共找到 %d 個文件夾,%d 個文件,共 %I64dK 字節";

bool all;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	DialogBoxParam (hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc, 0);
	return 0;
}

BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND	hwndOk;
	HANDLE	hIcon;
	static TCHAR szBuffer[MAX_PATH];
	HINSTANCE	hInstance;

	switch (message)
	{
		case WM_INITDIALOG:
			hWinMain	= hwnd;
			hwndOk	= GetDlgItem (hwnd, IDOK);
			EnableWindow(hwndOk, false) ;
			SendDlgItemMessage (hwnd, IDC_EDIT, EM_SETLIMITTEXT,MAX_PATH,0);

			hInstance	= GetModuleHandle (NULL); 
			hIcon	= LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON) );
			SendMessage(hwnd,WM_SETICON,ICON_BIG, (LPARAM)hIcon);
			return true;

		case WM_COMMAND:
			switch (LOWORD(wParam) )
			{
				case IDOK:
					if (dwOption & F_SEARCHING)
						dwOption |= F_STOP;
					else
					{
						GetDlgItemText (hwnd, IDC_EDIT, szPath, MAX_PATH);
						_beginthread (ProcThread, 0, szPath) ;//啓動線程函數
					}
					break;

				case IDC_ALL:
					all = true;
					EnableWindow(hwndOk, true) ;
					GetLogicalDriveStrings (sizeof (szPath), szPath);
					_beginthread (ProcThread, 0, szPath) ;//啓動線程函數
					
					break;

				case IDC_BROWSE:
					if (BrowseFolder(hwnd, szPath) )
						SetDlgItemText(hwnd, IDC_EDIT, szPath);
					break;
				
				case IDC_PATH:
					MessageBox (hwnd, L"IDPATH",L"提示",MB_OK);
					break;

				case IDC_EDIT:
					int ch	= GetDlgItemText (hwnd, IDC_EDIT, szBuffer, MAX_PATH);
					EnableWindow(hwndOk, ch) ;
					break;
			}
			return true;

		case WM_CLOSE:
			if	( !(dwOption & F_SEARCHING) )
				EndDialog(hwnd,NULL);
			return true;
	}

	return false;
}

void ProcThread (PVOID pvoid)
{
	TCHAR	szBuffer[256];
	dwOption &=  ~F_STOP;
	dwOption |=  F_SEARCHING;
	EnableWindow (GetDlgItem (hWinMain, IDC_BROWSE), FALSE);
	EnableWindow (GetDlgItem (hWinMain, IDC_EDIT), FALSE);
	EnableWindow (GetDlgItem (hWinMain, IDC_ALL), FALSE);
	SetDlgItemText (hWinMain, IDOK, TEXT("停止") );

	if (all)
	{
		TCHAR	Drive[4];
		for (int i=0; ; i += 4)
		{
			if (szPath[i] == L'\0')
				break;
			lstrcpy (Drive, szPath);
			FindFile (&szPath[i]);
		}
	}
	else
		FindFile (szPath);

	wsprintf (szBuffer, szSearchInfo, dwFolderCount,dwFileCount, dwFileSize / 1000);
	SetDlgItemText (hWinMain, IDC_PATH, szBuffer);

	EnableWindow (GetDlgItem (hWinMain, IDC_BROWSE), TRUE);
	EnableWindow (GetDlgItem (hWinMain, IDC_EDIT), TRUE);
	EnableWindow (GetDlgItem (hWinMain, IDC_ALL), TRUE);
	SetDlgItemText (hWinMain, IDOK, TEXT("開始") );
	SetDlgItemText (hWinMain,IDC_EDIT, szPath);
	dwOption &= ~F_SEARCHING;
}


 

#ifndef BROWSEFOLDER_H
#define BROWSEFOLDER_H

#include <shlobj.h>

TCHAR	szDirInfo[] = L"請選擇目錄:";
TCHAR* BrowseFolderTmp;

int CALLBACK BrowseFolderCallBack(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData)//瀏覽對話框回調函數
{
	TCHAR szBuffer[130];
	if (msg	== BFFM_INITIALIZED)
		SendMessage (hwnd, BFFM_SETSELECTION, true, (LPARAM)BrowseFolderTmp);
	else
		if (msg	== BFFM_SELCHANGED)
		{
			SHGetPathFromIDList ((LPCITEMIDLIST)lParam, szBuffer);
			SendMessage(hwnd,BFFM_SETSTATUSTEXT,0, (LPARAM)szBuffer);
		}
	return 0;
}

int BrowseFolder(HWND hwnd, TCHAR szBuffer[])//瀏覽對話框模塊
{
	BROWSEINFO	  stBrowseInfo;
	IMalloc		  *stMalloc;
	bool		  dwReturn;
	LPCITEMIDLIST pidlParent;

	CoInitialize (NULL);
	if ( E_FAIL == SHGetMalloc (&stMalloc) )
	{
		CoUninitialize();
		return false;
	}
	
	RtlZeroMemory (&stBrowseInfo, sizeof (stBrowseInfo) );
	stBrowseInfo.hwndOwner	= hwnd;
	BrowseFolderTmp	= szBuffer;
	stBrowseInfo.lpfn	= BrowseFolderCallBack;
	stBrowseInfo.lpszTitle	= szDirInfo;
	stBrowseInfo.ulFlags	= BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
	if (NULL == ( pidlParent	= SHBrowseForFolder (&stBrowseInfo) ))
		dwReturn	= FALSE;
	else
	{
		dwReturn	= TRUE;
		SHGetPathFromIDList (pidlParent, szBuffer);
	}
	stMalloc->Free ((void *)pidlParent);
	stMalloc->Release();
	CoUninitialize();
	return dwReturn;
}


#endif


 

#ifndef FINDFILE_H
#define FINDFILE_H
#define F_SEARCHING 1
#define F_STOP	2	

extern	HWND hWinMain;//主窗口句柄
long long  dwFileSize;
unsigned int dwFileCount;
unsigned int dwFolderCount;
int dwOption;

void ProcessFile (TCHAR szFile[])//處理文件模塊
{
	HANDLE hFile;
	dwFileCount++;
	SetDlgItemText (hWinMain, IDC_PATH, szFile);
	if (INVALID_HANDLE_VALUE != (hFile = CreateFile (szFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ) )
		dwFileSize += GetFileSize (hFile, NULL);
	CloseHandle (hFile);
}

void FindFile (TCHAR szPath[])//目錄搜索模塊
{
	HANDLE	hFindFile;
	WIN32_FIND_DATA stFindFile;
	TCHAR szSearch[MAX_PATH];
	TCHAR szFindFile[MAX_PATH];

	int len = lstrlen (szPath);
	if (szPath[len-1] != L'\\')
	{
		szPath[len] =	L'\\';
		szPath[len+1]	= 0;
	}	
	lstrcpy (szSearch, szPath);
	lstrcat (szSearch, TEXT("*.*") );

	bool res;
	if ( INVALID_HANDLE_VALUE != ( hFindFile = FindFirstFile (szSearch, &stFindFile ) ))
		do
		{
			lstrcpy (szFindFile, szPath);
			lstrcat (szFindFile, stFindFile.cFileName);
			if (stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if ( stFindFile.cFileName[0] != L'.'  )
				{
					dwFolderCount++;
					FindFile(szFindFile);
				}
			}
			else
				ProcessFile( szFindFile);
			res	= FindNextFile (hFindFile, &stFindFile);				
		}while ( (res != FALSE) && !( dwOption & F_STOP));
		FindClose (hFindFile);
}

#endif


 

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by browse.rc
//
#define IDD_DIALOG1                     101
#define IDD_DIALOG                      101
#define IDI_ICON1                       102
#define IDI_ICON                        102
#define IDC_BROWSE                      1001
#define IDC_EDIT                        1002
#define IDC_PATH                        1003
#define IDC_BUTTON1                     1004
#define IDC_ALL                         1004

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        103
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1005
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


 

發佈了59 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章