make clean for Visual Studio
От: InstantI Украина  
Дата: 16.02.11 19:07
Оценка:
Иногда возникает необходимость скопировать папку проекта (Visual Studio), например, на флешку или в сетевую шару. Проблемой становятся файлы, которые нагенерировала студия: база Intellisense, логи, объектные файлы и т.п. Из простого копирования нескольких *.cpp файлов процесс может превратиться в довольно длительное ожидание или нехватку места Написал небольшую утилитку которая удаляет "лишние" файлы студии в указанной папке и подпапках. Пример использования:
.\vsgarbage D:\Projects\CPP\HelloWorld

Код утилиты:
#include <iostream>

#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

typedef std::vector<std::string> GarbageList;

GarbageList g_garbage_extensions;
const int EQUALS = 0;  // Strings are equals

void InitializeGarbageFileExtensions(GarbageList& list)
{
    list.push_back(".obj");
    list.push_back(".log");
    list.push_back(".sdf");
    list.push_back(".ipch");
    list.push_back(".idb");
    list.push_back(".pdb");
    list.push_back(".ilk");
    list.push_back(".dep");
    list.push_back(".tmp");
    list.push_back(".tlog");
    list.push_back(".lastbuildstate");
    list.push_back(".opensdf");
}

bool IsGarbage(fs::path& item)
{
    if (!fs::is_directory(item))  // Only files are checked
    {
        std::string extension = item.extension();
        for (GarbageList::iterator it = g_garbage_extensions.begin();
            it != g_garbage_extensions.end(); ++it)
        {
            std::string& current = (*it);
            if (extension.compare(current) == EQUALS)
            {
                return true;
            }
        }
    }
    return false;
}

int main(int argc, char** argv)
{    
    if (argc > 1)
    {
        char* dir = argv[1];
        std::cout << "Deleting garbage in: " << dir << std::endl;
        fs::path dir_path(dir);
        if (fs::is_directory(dir_path))
        {
            InitializeGarbageFileExtensions(g_garbage_extensions);
            fs::recursive_directory_iterator end_it;
            int items_removed = 0;
            for (fs::recursive_directory_iterator it(dir_path); it != end_it; ++it)
            {
                fs::path current(it->path());
                if (IsGarbage(current))
                {
                    fs::remove(current);
                    items_removed++;
                }
            }
            std::cout << "Items deleted: " << items_removed << std::endl;
        }
        else
        {
            std::cerr << "Error. Specified path is not a directory\n";
        }
    }
    else
    {
        std::cout << "Usage: .\\vsgarbage path_to_directory\n";
    }
    return 0;
}

Готовный бинарник можно взять в прикрепленных файлах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.