最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++ 監(jiān)控磁盤與目錄操作的示例

 更新時間:2020年10月19日 09:19:11   作者:lyshark  
這篇文章主要介紹了C/C++ 監(jiān)控磁盤與目錄操作的示例,幫助大家更好的理解和學(xué)習(xí)C/C++編程,感興趣的朋友可以了解下

遍歷磁盤容量:

#include <stdio.h>
#include <Windows.h>

void GetDrivesType(const char* lpRootPathName)
{
	UINT uDriverType = GetDriveType(lpRootPathName);
	switch (uDriverType)
	{
		case DRIVE_UNKNOWN:puts("未知磁盤"); break;
		case DRIVE_NO_ROOT_DIR: puts("路徑無效"); break;
		case DRIVE_REMOVABLE: puts("可移動磁盤"); break;
		case DRIVE_FIXED: puts("固定磁盤"); break;
		case DRIVE_REMOTE: puts("網(wǎng)絡(luò)磁盤"); break;
		case DRIVE_CDROM: puts("光驅(qū)"); break;
		case DRIVE_RAMDISK: puts("內(nèi)存映射盤"); break;
		default: break;
	}
}

void GetDrivesFreeSpace(const char* lpRootPathName)
{
	unsigned long long available, total, free;
	if (GetDiskFreeSpaceEx(lpRootPathName, (ULARGE_INTEGER*)&available, 
		(ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free))
	{
		printf("磁盤: %s | 總計: %lld MB 已用: %lld MB 剩余: %lld MB \n",
			lpRootPathName, total >> 20, available >> 20, free >> 20);
	}
}

int main(int argc,char *argv[])
{
	DWORD dwSize = MAX_PATH;
  char szLogicalDrives[MAX_PATH] = {0};

  // 獲取邏輯驅(qū)動器號字符串
	DWORD dwResult = GetLogicalDriveStringsA(dwSize, szLogicalDrives);
	
	if (dwResult > 0 && dwResult <= MAX_PATH) {
		char* szSingleDrive = szLogicalDrives;      // 從緩沖區(qū)起始地址開始
		while (*szSingleDrive) {
			//printf("Drive: %s\n", szSingleDrive);   // 輸出單個驅(qū)動器的驅(qū)動器號
			// GetDrivesType(szSingleDrive);
			GetDrivesFreeSpace(szSingleDrive);
			szSingleDrive += strlen(szSingleDrive) + 1; // 獲取下一個驅(qū)動器地址
		}
	}

	system("pause");
	return 0;
}

遍歷文件特定路徑:

循環(huán)遍歷文件路徑,并將文件后綴為.exe的路徑篩選出來.

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

void SearchFile(char *pszDirectory)
{
	// 搜索指定類型文件
	char *pszFileName = NULL;
	char *pTempSrc = NULL;
	WIN32_FIND_DATA FileData = { 0 };

	// 申請動態(tài)內(nèi)存
	pszFileName = new char[2048];
	pTempSrc = new char[2048];

	// 構(gòu)造搜索文件類型字符串 *.* 表示搜索所有文件類型
	wsprintf(pszFileName, "%s\\*.*", pszDirectory);

	HANDLE hFile = ::FindFirstFile(pszFileName, &FileData);
	if (INVALID_HANDLE_VALUE != hFile)
	{
		do
		{
			// 過濾掉當(dāng)前目錄"." 和上一層目錄".."
			if ('.' == FileData.cFileName[0])
				continue;

			// 拼接文件路徑	
			wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);
			// 判斷是否是目錄還是文件
			if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				SearchFile(pTempSrc);     // 如果是目錄則繼續(xù)遞歸
			else
			{
				char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
				_splitpath(pTempSrc, drive, dir, fname, ext);
				// 如果是文件并且后綴為.exe則輸出具體路徑
				if (strcmp(ext, ".exe") == 0)
					printf("%s \n", pTempSrc);
			}
		} while (::FindNextFile(hFile, &FileData));
	}
	FindClose(hFile);
	delete[]pTempSrc;
	delete[]pszFileName;
}

int main(int argc, char * argv[])
{
	SearchFile("c:\\MinGW7");
	system("pause");
	return 0;
}

監(jiān)控文件目錄變化:

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

UINT MonitorFileThreadProc(LPVOID lpVoid)
{
	char *pszDirectory = (char *)lpVoid;

	// 打開目錄, 獲取文件句柄
	HANDLE hDirectory = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
	if (INVALID_HANDLE_VALUE == hDirectory)
		return 1;

	char szFileName[MAX_PATH] = { 0 };
	BOOL bRet = FALSE;
	DWORD dwRet = 0;
	DWORD dwBufferSize = 2048;

	// 申請一個足夠大的緩沖區(qū) 
	BYTE *pBuf = new BYTE[dwBufferSize];
	if (NULL == pBuf)
		return 2;

	FILE_NOTIFY_INFORMATION *pFileNotifyInfo = (FILE_NOTIFY_INFORMATION *)pBuf;

	// 開始循環(huán)設(shè)置監(jiān)控
	do
	{
		RtlZeroMemory(pFileNotifyInfo, dwBufferSize);
		// 設(shè)置監(jiān)控目錄
		bRet = ReadDirectoryChangesW(hDirectory, pFileNotifyInfo, dwBufferSize, TRUE,
			FILE_NOTIFY_CHANGE_FILE_NAME |			// 修改文件名
			FILE_NOTIFY_CHANGE_ATTRIBUTES |			// 修改文件屬性
			FILE_NOTIFY_CHANGE_LAST_WRITE,			// 最后一次寫入
			&dwRet, NULL, NULL);
		if (FALSE == bRet)
			break;

		// 將寬字符轉(zhuǎn)換成窄字符,寬字節(jié)字符串轉(zhuǎn)多字節(jié)字符串
		WideCharToMultiByte(CP_ACP, 0, (wchar_t *)(&pFileNotifyInfo->FileName),
			(pFileNotifyInfo->FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);

		// 將路徑與文件連接成完整文件路徑
		char FullFilePath[1024] = { 0 };
		strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
		strcat(FullFilePath, szFileName);

		// 判斷操作類型并顯示
		switch (pFileNotifyInfo->Action)
		{
			case FILE_ACTION_ADDED:
				printf("文件被 [創(chuàng)建]: %s \n", FullFilePath); break;
			case FILE_ACTION_REMOVED:
				printf("文件被 [刪除]: %s \n", FullFilePath); break;
			case FILE_ACTION_MODIFIED:
				printf("文件被 [修改]: %s \n", FullFilePath); break;
			case FILE_ACTION_RENAMED_OLD_NAME:
				printf("文件被 [重命名]: %s \n", FullFilePath); break;
		}
	} while (bRet);

	CloseHandle(hDirectory);
	delete[] pBuf;
	pBuf = NULL;
	return 0;
}

int main(int argc, char * argv[])
{
	char *pszDirectory = "C:\\";
	// 創(chuàng)建線程開始監(jiān)控
	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorFileThreadProc, pszDirectory, 0, NULL);
	while (1)
	{
		Sleep(10000);
	}
	system("pause");
	return 0;
}

監(jiān)控目錄文件變化:

可以將其改為一個簡單的文件防篡改程序,也可以用來監(jiān)控病毒的行為.

#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>

DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)
{
	char *pszDirectory = (char *)lParam;
	BOOL bRet = FALSE;
	BYTE Buffer[1024] = { 0 };

	FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;
	DWORD dwByteReturn = 0;
	HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
		NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
		return 1;

	while (TRUE)
	{
		ZeroMemory(Buffer, sizeof(Buffer));
		// 設(shè)置監(jiān)控目錄回調(diào)函數(shù)
		bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,
			FILE_NOTIFY_CHANGE_FILE_NAME |			// 修改文件名
			FILE_NOTIFY_CHANGE_ATTRIBUTES |			// 修改文件屬性
			FILE_NOTIFY_CHANGE_LAST_WRITE,			// 最后一次寫入
			&dwByteReturn, NULL, NULL);
		if (TRUE == bRet)
		{
			char szFileName[MAX_PATH] = { 0 };

			// 將寬字符轉(zhuǎn)換成窄字符,寬字節(jié)字符串轉(zhuǎn)多字節(jié)字符串
			WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,(pBuffer->FileNameLength / 2),
				szFileName,MAX_PATH,NULL,NULL);

			// 將路徑與文件連接成完整文件路徑
			char FullFilePath[1024] = { 0 };
			strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
			strcat(FullFilePath, szFileName);

			switch (pBuffer->Action)
			{
				case FILE_ACTION_ADDED:
				{
					printf("添加: %s \n", FullFilePath); break;
				}
				case FILE_ACTION_REMOVED:
				{
					printf("刪除: %s \n", FullFilePath); break;
				}
				case FILE_ACTION_MODIFIED:
				{
					printf("修改: %s \n", FullFilePath); break;
				}
				case FILE_ACTION_RENAMED_OLD_NAME:
				{
					printf("重命名: %s", szFileName);
					if (0 != pBuffer->NextEntryOffset)
					{
						FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)
							((DWORD)pBuffer + pBuffer->NextEntryOffset);
						switch (tmpBuffer->Action)
							{
								case FILE_ACTION_RENAMED_NEW_NAME:
								{
									ZeroMemory(szFileName, MAX_PATH);
									WideCharToMultiByte(CP_ACP,0,tmpBuffer->FileName,
										(tmpBuffer->FileNameLength / 2),
										szFileName,MAX_PATH,NULL,NULL);
									printf(" -> %s \n", szFileName);
									break;
								}
							}
					}
					break;
				}
				case FILE_ACTION_RENAMED_NEW_NAME:
				{
					printf("重命名(new): %s \n", FullFilePath); break;
				}
			}
		}
	}
	CloseHandle(hFile);
	return 0;
}

int main(int argc, char * argv[])
{
	char *pszDirectory = "C:\\";

	HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);
	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);
	return 0;
}

以上就是C/C++ 監(jiān)控磁盤與目錄操作的示例的詳細(xì)內(nèi)容,更多關(guān)于C/C++ 監(jiān)控磁盤與目錄操作的資料請關(guān)注腳本之家其它相關(guān)文章!

文章作者:lyshark
文章出處:https://www.cnblogs.com/lyshark

相關(guān)文章

  • C++11中std::thread線程實現(xiàn)暫停(掛起)功能

    C++11中std::thread線程實現(xiàn)暫停(掛起)功能

    本文主要介紹了C++11中std::thread線程實現(xiàn)暫停(掛起)功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 基于Matlab實現(xiàn)鯨魚優(yōu)化算法的示例代碼

    基于Matlab實現(xiàn)鯨魚優(yōu)化算法的示例代碼

    鯨魚優(yōu)化算法(WOA)是澳大利亞學(xué)者M(jìn)irjaili等于2016年提出的群體智能優(yōu)化算法,根據(jù)座頭鯨的捕獵行為實現(xiàn)優(yōu)化搜索的目的。本文將利用Matlab實現(xiàn)這一算法,需要的可以參考一下
    2022-04-04
  • C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解

    C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解

    這篇文章主要介紹了C++類繼承 繼承后函數(shù)的值實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 深入分析C++中deque的使用

    深入分析C++中deque的使用

    本篇文章介紹了,深入分析C++中deque的使用。需要的朋友參考下
    2013-05-05
  • C++模板之特化與偏特化詳解

    C++模板之特化與偏特化詳解

    這篇文章主要介紹了C++模板之特化與偏特化詳解,本文講解了什么是C++模板、模板特化、模板偏特化、特化與偏特化的調(diào)用順序等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++學(xué)習(xí)之線程詳解

    C++學(xué)習(xí)之線程詳解

    多線程是開發(fā)中必不可少的,往往我們需要多個任務(wù)并行,就需要多線程開發(fā)。本文將帶大家深入學(xué)習(xí)一下C++中的常用的一些知識點,感興趣的同學(xué)可以了解一下
    2021-12-12
  • 詳解C++之函數(shù)重載

    詳解C++之函數(shù)重載

    這篇文章主要介紹了c++函數(shù)重載的相關(guān)知識,文章講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++進(jìn)程鏈接工具之通信器詳解

    C++進(jìn)程鏈接工具之通信器詳解

    本文主要介紹了C++通信器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-11-11
  • C++實現(xiàn)基于控制臺界面的吃豆子游戲

    C++實現(xiàn)基于控制臺界面的吃豆子游戲

    這篇文章主要介紹了C++實現(xiàn)基于控制臺界面的吃豆子游戲,實例分析了吃豆子游戲的原理與C++實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點

    C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點

    工廠方法模式是一個創(chuàng)建型設(shè)計模式,通過定義一個創(chuàng)建對象的接口,讓其子類決定實例化哪一個工廠類,這篇文章主要給大家介紹了關(guān)于C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點,需要的朋友可以參考下
    2021-06-06

最新評論

罗甸县| 隆德县| 大渡口区| 大足县| 阿拉善右旗| 运城市| 邵阳县| 白山市| 桐柏县| 舟山市| 宁安市| 鄂托克前旗| 天门市| 南皮县| 洪湖市| 东山县| 界首市| 大石桥市| 平和县| 玉环县| 鄂伦春自治旗| 江孜县| 双江| 康定县| 宁德市| 海伦市| 南和县| 噶尔县| 长沙县| 西丰县| 剑阁县| 东安县| 绥阳县| 内江市| 家居| 洪江市| 综艺| 定南县| 伊宁市| 武宣县| 庆云县|