码迷,mamicode.com
首页 > 其他好文 > 详细

CodeFolderClear 自动清理代码文件夹下无用文件的小程序及源码

时间:2014-07-29 17:46:52      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:工具   vc   清理   

最近常要用U盘拷贝代码,发现编译器生成的各种中间文件占用了大量的空间,手工删除起来费时费力,所以就萌生了写一个小工具搞定这一切都念头。

说干就干,晚上熬夜搞定!

小工具程序及源码工程的下载链接:    点击下载


用简单的方式进行处理,递归删除。下面统计量下要删除的文件:

工程目录下: 工程目录的判断依据: 有工程文件 *.vcxproj
    *.sdf
    *.suo
    *.user
 
    生成目录(Debug/Release等)下的文件:
        *.obj
        *.cache
        *.exp
        *.ilk
        *.lastbuildstate
        *.map
        *.pch
        *.tlog
        *.idb
        *.embed.manifest.res
        *_manifest.rc
        BuildLog.htm
        
        下面的这些文件只有是在生成目录下的时候才能删除,其它目录下的时候不能删除.
        *.log
        *.pdb
        *.dll
        *.ocx
        *.lib
        *.exe


下面是代码,就一个文件:

#pragma once

#include <Windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

// 可以直接删除的文件.
const wchar_t* DirectDeleteFileExt[] =
{
	L".sdf",
	L".suo",
	L".user",

	L".obj",
	L".cache",
	L".exp",
	L".ilk",
	L".lastbuildstate",
	L".map",
	L".pch",
	L".ipch",
	L".tlog",
	L".idb",
	L".embed.manifest.res",
	L".embed.manifest",
	L".intermediate.manifest",
	L"_manifest.rc",
	L"BuildLog.htm",

	0
};

// 生成目录下可以删除的文件.
const wchar_t* BuildDirDeleteFileExt[] =
{
	L".log",
	L".pdb",
	L".dll",
	L".ocx",
	L".lib",
	L".exe",
	0
};

bool DelFile( const wchar_t* fileName)
{
	SetFileAttributesW( fileName,FILE_ATTRIBUTE_NORMAL);
	if(DeleteFileW( fileName) )
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool IsFileNameMatch( const wstring& fileName, const wchar_t* pExt )
{
	int offset = fileName.length() - wcslen( pExt );
	if ( offset < 0 )
	{
		return false;
	}
	for ( size_t i=offset;i < fileName.length(); ++i )
	{
		if ( tolower( fileName[i] ) != tolower( pExt[i-offset]) )
		{
			return false;	// 不想等.
		}
	}

	return true;
}

bool IsFileNameMatch( const wstring& fileName, const wchar_t** ppExt )
{
	while( *ppExt )
	{
		if ( IsFileNameMatch( fileName, *ppExt ) )
		{
			return true;
		}

		ppExt++;
	}
	return false;
}


// 文件是否可以直接删除.
bool IsFileDirectDeleted( const wstring& fileName )
{
	return IsFileNameMatch( fileName, DirectDeleteFileExt );
}

// 文件是否可以在生成目录下删除.


bool ClearFolder( const wstring& folderPath, bool isProjectDir = false )
{
	wstring keyWord = folderPath;
	keyWord += L"\\*";
	WIN32_FIND_DATAW fdata = {0};  

	HANDLE hSearch = ::FindFirstFileW( keyWord.c_str(),&fdata);
	if(hSearch == INVALID_HANDLE_VALUE)    
	{
		wcerr << "Search folder fail! -> " << keyWord.c_str() << endl;
		return false;
	}
	do 
	{
		if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
		{
			if ( 0 == wcscmp( L".", fdata.cFileName ) || 0 == wcscmp( L"..", fdata.cFileName ) )
			{
				continue;
			}
			else
			{
				wcout << "Folder: " << fdata.cFileName << endl;

				wstring subDir = folderPath;
				subDir += L"\\";
				subDir += fdata.cFileName;
				ClearFolder( subDir );
			}
		}	
		else
		{
			// 如果这个目录下有 .obj 文件, 那么就认为这个目录是生成目录, 扩大删除范围.
			if ( !isProjectDir )
			{
				if ( IsFileNameMatch( fdata.cFileName, L".obj" ) )
				{
					// 重来一遍.
					ClearFolder( folderPath, true );
					break; // 不需要继续了.
				}
			}

			if ( IsFileDirectDeleted( fdata.cFileName )
				|| ( isProjectDir && IsFileNameMatch( fdata.cFileName, BuildDirDeleteFileExt ) ) )
			{
				wstring filePath = folderPath;
				filePath += L"\\";
				filePath += fdata.cFileName;

				wcout << "Del File: " << fdata.cFileName << endl;
				DelFile( filePath.c_str() );

				continue;
			}
		}
	} while(FindNextFileW(hSearch, &fdata));
	FindClose(hSearch);

	return true;
}

int main()
{
	_TCHAR szCurDir[ MAX_PATH ] = {0};
	GetCurrentDirectory( MAX_PATH, szCurDir );

	ClearFolder( szCurDir );
	
#ifdef DEBUG
	system( "pause" );
#endif
	return 0;
}


CodeFolderClear 自动清理代码文件夹下无用文件的小程序及源码,布布扣,bubuko.com

CodeFolderClear 自动清理代码文件夹下无用文件的小程序及源码

标签:工具   vc   清理   

原文地址:http://blog.csdn.net/thinkingl/article/details/38273611

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!