【问题标题】:Delete all folders except specific folders删除除特定文件夹外的所有文件夹
【发布时间】:2012-12-15 21:47:53
【问题描述】:

我已经有了一次删除一个文件夹的增强功能。 remove_all();

文件夹列表是:

folder1
folder2
folder3
folder4
folder5

我想用上面的函数将它们全部删除,但保留文件夹 2 和文件夹 5。

【问题讨论】:

  • 你不能循环浏览文件夹并检查它们是否不是folder2folder5,如果不是,请删除它们?
  • 将你想要保留的那些加载到一个std::set<:string>中,然后将它传递给一个只删除项目的增强删除函数不在该集合中。如果您要递归到子文件夹,您可能需要发挥创造力。
  • 编写一个函数,它接受一个“要保留的文件夹”列表,并将每个“可能删除这个”与“要保留的文件夹”列表进行比较,如果它在保留列表中,不要删除它(或者删除后写“哈哈,反正删了”,你的很狡猾!)
  • 我找到了答案,但我还不能发布,因为我是新用户...
  • @Peteragent5 好的,我会给你+1。您应该在答案中显示一些工作代码。

标签: c++ directory boost-filesystem


【解决方案1】:

我实际上找到了两种方法来做到这一点。

首先我将文件夹列表放入一个数组中。

第一种方法:使用函数在我的字符串数组中查找子字符串,然后将其擦除。

第二种方法:使用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;
}

【讨论】:

  • 此解决方案对字符串操作的严重依赖使得 (1) 难以阅读和 (2) 容易出错。您应该尝试结合@WhozCraig 的提示,即使用集合来存储您想要保存的目录,并更多地使用 boost::filesystem 为您提供的类型和函数,而不是摆弄完整路径的字符串表示。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多