Удалить все папки, кроме определенных папок

У меня уже есть функция ускорения для удаления одной папки за раз. remove_all();

Список папок:

folder1
folder2
folder3
folder4
folder5

Я хочу удалить их все с помощью моей функции выше, но сохранить папки2 и папки5.


person Peteragent5    schedule 31.12.2012    source источник
comment
Не могли бы вы просмотреть папки и проверить, не являются ли они folder2 или folder5, и если нет, то удалить их?   -  person Cornstalks    schedule 01.01.2013
comment
Загрузите те, которые вы хотите сохранить, в std::set‹std::string›, а затем передайте их расширенной функции удаления, которая удаляет только элементы не в этом наборе. . вам, возможно, придется проявить творческий подход, если вы рекурсивно переходите в подпапки.   -  person WhozCraig    schedule 01.01.2013
comment
Напишите функцию, которая берет список папок, которые нужно сохранить, и сравнивает каждую, возможно, удалите это со списком папок, которые нужно сохранить, и если она есть в списке сохранения, не удаляйте ее (или напишите ха-ха, все равно удалил ее после удаления, из вас коварные!)   -  person Mats Petersson    schedule 01.01.2013
comment
Я нашел ответ, но пока не могу его опубликовать, потому что я новый пользователь...   -  person Peteragent5    schedule 01.01.2013
comment
@Peteragent5 В чем проблема с публикацией? Вы должны быть в состоянии ответить на свой вопрос, насколько я знаю, это, по крайней мере, поощряемое поведение на SO.   -  person πάντα ῥεῖ    schedule 01.01.2013
comment
@g-makulik Ошибка такая: Users with less than 10 reputation can't answer their own question for 8 hours after asking. You may self-answer in 4 hours. Until then please use comments, or edit your question instead.   -  person Peteragent5    schedule 01.01.2013
comment
@Peteragent5 Хорошо, я поставлю тебе +1. Вы должны показать некоторый рабочий код в своем ответе.   -  person πάντα ῥεῖ    schedule 01.01.2013
comment
@g-makulik Спасибо, я всегда люблю помогать другим. И да, код должен появиться еще через 1 час.   -  person Peteragent5    schedule 01.01.2013
comment
Хорошо, все в порядке. Спасибо всем!   -  person Peteragent5    schedule 01.01.2013


Ответы (1)


На самом деле я нашел 2 способа, как это сделать.

Сначала я помещаю свой список папок в массив.

1-й способ: использовал функцию, чтобы найти подстроку в моем массиве строк, а затем стереть ее.

2-й способ: использовал strcmp для сравнения с моим массивом строк, затем удалил найденный тег поиска.

И вот окончательный код:

// simple_ls program form boost examples
// http://www.boost.org/doc/libs/1_52_0/libs/filesystem/example/simple_ls.cpp
#define BOOST_FILESYSTEM_VERSION 3

//  We don't want to use any deprecated features
#ifndef BOOST_FILESYSTEM_NO_DEPRECATED 
#  define BOOST_FILESYSTEM_NO_DEPRECATED
#endif
#ifndef BOOST_SYSTEM_NO_DEPRECATED 
#  define BOOST_SYSTEM_NO_DEPRECATED
#endif

#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/progress.hpp"
#include <iostream>
#include <cstring>

using namespace std;
using namespace boost::filesystem;
unsigned long dir_count = 0;

void RemoveSub(string& sInput, const string& sub) {
    string::size_type foundpos = sInput.find(sub);
    if ( foundpos != string::npos )
        sInput.erase(sInput.begin() + foundpos, sInput.begin() + foundpos + sub.length());
}

int listDir(string d) {
d.erase(
remove( d.begin(), d.end(), '\"' ),
d.end()
); //Remove Quotes

if (!is_directory(d)) {
    cout << "\nNot found: " << d << endl;
    return 1;
  }
    directory_iterator end_iter;
    for (directory_iterator dir_itr(d);
        dir_itr != end_iter;
        ++dir_itr) {
            if (is_directory(dir_itr->status())) {
            ++dir_count;
            string v = dir_itr->path().filename().string();
            v.erase(
            remove( v.begin(), v.end(), '\"' ),
            v.end()
            );
            string m[] = { v };
            string mm = m[0].c_str();
            RemoveSub(mm, "folder2"); // Keep folder2
            RemoveSub(mm, "folder5"); // Keep folder5
/*
            if( strcmp(m[0].c_str(), "folder2") == 0 ) mm.erase (mm.begin(), mm.end()); // Keep folder2
            if( strcmp(m[0].c_str(), "folder5") == 0 ) mm.erase (mm.begin(), mm.end()); // Keep folder5
*/
            if(!mm.empty()) { // Remove folders
            cout << "\nRemoving: " << mm << " ...";
            remove_all(d+"/"+mm);
            }
        }
    }
    return 0;
}

int main(int argc, char* argv[]) {
string i;
cout << "\nx: Exit\n\nDelete all folders in: ";
getline(cin,i);
if(i=="X" || i=="x") return 0;
if(i.empty()) return 0;

listDir(i); //Call our function
return 0;
}
person Peteragent5    schedule 01.01.2013
comment
Сильная зависимость этого решения от манипуляций со строками делает его (1) трудным для чтения и (2) подверженным ошибкам. Вам следует попробовать включить подсказку @WhozCraig об использовании коллекции для хранения каталогов, которые вы хотите сохранить, и больше работать с типами и функциями, которые вам предоставляет boost::filesystem, вместо того, чтобы возиться со строковыми представлениями полных путей. - person us2012; 01.01.2013