自删除/删除目录下所有文件

#include 
#include 
#include 
#include 
#include 

#pragma comment(lib,"Shlwapi.lib")


//获取文件名字  
BOOL GetFileName(const wchar_t* pImageFilePath, wchar_t* pFileName)  
{  

	if (IsBadReadPtr(pImageFilePath, 1) != 0 || IsBadWritePtr(pFileName, 1) != 0)  
	{  
		return FALSE;  
	}  

	int Length=wcslen(pImageFilePath)*sizeof(wchar_t);  

	//c:\\123\\456\\789.sys  
	if (wcsstr(pImageFilePath,TEXT("\\")))  
	{  
		PWCHAR p;  
		ULONG l;  
		p = (PWCHAR)&pImageFilePath[Length >> 1];  
		while (*(p - 1) != '\\')  
		{  
			p--;  
		}  
		l = (ULONG)(&pImageFilePath[Length >> 1] - p);  
		l *= sizeof(WCHAR);  

		CopyMemory(pFileName,p,l);  
	}  
	else  
	{  
		CopyMemory(pFileName,pImageFilePath,Length);  
	}  

	return TRUE;  
}

//移动文件
BOOL MoveFileTempPath(wchar_t* pFilePath)
{
	wchar_t szTempPath[MAX_PATH]={0};
	wchar_t szDesFile[MAX_PATH]={0};
	wchar_t szFileName[MAX_PATH]={0};
	DWORD ccBuffer=ARRAYSIZE(szTempPath);

	assert(pFilePath);
	if (IsBadReadPtr(pFilePath, 1) != 0)
	{
		return FALSE;
	}

	if (!PathFileExists(pFilePath))
	{
		return FALSE;
	}

	GetTempPath(ccBuffer,szTempPath);
	GetFileName(pFilePath,szFileName);
	_sntprintf_s(szDesFile,sizeof(szDesFile),TEXT("%s\\%s.old"),szTempPath,szFileName);
	if (MoveFileEx(pFilePath, szDesFile,MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH)==FALSE)
	{
		return FALSE;
	}
	MoveFileEx(szDesFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
	return TRUE;
}

//删除目录下所有文件
BOOL DeleteDirectory(LPTSTR psDirName)   
{   
	WIN32_FIND_DATA FileData = {0};
	TCHAR FileFmt[MAX_PATH] = {0};
	BOOL IsFound = FALSE;
	HANDLE hFindFile = INVALID_HANDLE_VALUE;
	BOOL Result = FALSE;

	_sntprintf_s(FileFmt, sizeof(FileFmt),TEXT("%s\\*"), psDirName);
	hFindFile = FindFirstFile(FileFmt, &FileData);
	if (INVALID_HANDLE_VALUE != hFindFile)
	{
		do 
		{
			if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if (TEXT('.') != FileData.cFileName[0])
				{
					_sntprintf_s(FileFmt, sizeof(FileFmt),TEXT("%s\\%s"), psDirName, FileData.cFileName);
					Result = DeleteDirectory(FileFmt);
					if (!Result)
					{
						break;
					}
				}
			}
			else
			{
				_sntprintf_s(FileFmt, sizeof(FileFmt),TEXT("%s\\%s"), psDirName, FileData.cFileName);
				SetFileAttributes(FileFmt, FILE_ATTRIBUTE_NORMAL);
				Result = DeleteFile(FileFmt);
				if (!Result)
				{
					//重启删除文件
					MoveFileTempPath(FileFmt);

					//break;
					//2017年9月11日16:06:37由于当前卸载程序占用了当前目录,故删除不了当前目录

				}

			}
			IsFound = FindNextFile(hFindFile, &FileData);
		} while (IsFound);

		if (Result)
		{
			Result = RemoveDirectory(psDirName);
		}

		FindClose(hFindFile);
		hFindFile = INVALID_HANDLE_VALUE;
	}

	//如果当前目录删除失败添加到开机自动删除
	if(!RemoveDirectory(psDirName))
	{		
		MoveFileEx(psDirName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
	}
	return Result;
}

//删除自身文件
BOOL DeleteItselfFileName(void)
{
	wchar_t szFilePath[MAX_PATH]={0};
	DWORD nSize=ARRAYSIZE(szFilePath);
	GetModuleFileName(NULL,szFilePath,nSize);
	return MoveFileTempPath(szFilePath);
}


int main (void)
{
	
	getchar();
	getchar();
	return TRUE;
}

你可能感兴趣的:(windows编程)