2012-12-31 331 views
2

我已經有一個提升功能來一次刪除一個文件夾。 remove_all();刪除除特定文件夾以外的所有文件夾

文件夾列表是:

folder1 
folder2 
folder3 
folder4 
folder5 

我想刪除所有與我上面的功能,但保持文件夾2和folder5。

+2

你不能遍歷文件夾和檢查,如果他們不'folder2'或'folder5',如果不刪除它們? – Cornstalks

+0

加載你想*保存*到std :: set ,然後將其傳遞給增強刪除功能,該功能僅刪除該組中的項目* not *。如果您要遞歸到子文件夾中,您可能必須具有創意。 – WhozCraig

+0

編寫一個函數,其中包含「要保留的文件夾」列表,並將每個「可能刪除此文件」與「要保留的文件夾」列表進行比較,如果它位於保留列表中,請不要刪除它(或寫入「ha哈,刪除它反正「刪除後,你的狡猾!) –

回答

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; 
} 
+0

此解決方案對字符串操作的嚴重依賴性使得(1)難以閱讀並且(2)容易出錯。您應該嘗試合併@WhozCraig提示的使用集合來存儲您想要保存的目錄,並更多地使用boost :: filesystem爲您提供的類型和函數,而不是用完整路徑的字符串表示來擺弄。 – us2012

相關問題