最近常要用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 自动清理代码文件夹下无用文件的小程序及源码
原文地址:http://blog.csdn.net/thinkingl/article/details/38273611