2011-09-23 49 views
1

我打算製作一個程序,該程序可以在計算機上的文件夾和我的NAS之間使用。 它會列出兩個文件夾中的所有文件,然後確定哪個文件較新,然後將其上傳到其他設備。 我知道如何通過FTP上傳文件,但我一開始就卡住了,因爲我不知道如何列出我的文件。我對使用FindFirstFile()FindNextFile()以及WIN32_FIND_DATA進行了一些研究。這樣,我可以得到最後的寫入數據,但是這不會讓我列出子目錄。 你知道任何簡單的方法列出文件夾及其子目錄中的所有文件,並將每個文件的信息保存在列表中嗎?包含所有文件信息的C++文件列表

+0

我已將'winapi'標記添加到此帖子中,因爲它看起來像是在專門用於Windows。 –

+4

你知道rsync嗎?除非你喜歡發明輪子,否則不需要重新發明輪子;) – Thomas

+1

爲什麼你要自己編寫另一個這樣的備份工具?使用rsync,或者使用其中的一種N + infinity商業工具來完成這件事。 –

回答

2

FindFirstFile()FindNextFile()不會讓你列出子目錄。其中WIN32_FIND_DATA的成員之一爲dwFileAttributes,其中包括目錄條目的FILE_ATTRIBUTE_DIRECTORY。只需在該子目錄中啓動另一個FindFirstFile(),清洗並重復。

MSDN上有一個示例顯示如何使用FindFirstFile API,here

3

簡單的方法是使用boost::recursive_directory_iterator

#include <boost/foreach.hpp> 
#include <iostream> 
#include <vector> 
#include <boost/filesystem.hpp> 
#include <boost/date_time.hpp> 
#include <algorithm> 
#include <iterator> 
#include <ctime> 

using boost::filesystem::path; 
using boost::filesystem::recursive_directory_iterator; 
using boost::filesystem::directory_entry; 
using boost::filesystem::filesystem_error; 
using boost::filesystem::last_write_time; 
using std::vector; 
using std::cout; 
using std::copy; 
using std::ostream_iterator; 
using std::time_t; 
using boost::posix_time::from_time_t; 

int main(int ac, const char **av) 
{ 
    vector<const char*> args(av+1, av+ac); 
    if(args.empty()) 
    args.push_back("."); 
    vector<directory_entry> files; 
    BOOST_FOREACH(path p, args) 
    { 
    boost::system::error_code ec; 
    copy(recursive_directory_iterator(p, ec), 
     recursive_directory_iterator(), 
     back_inserter(files)); 
    } 
    BOOST_FOREACH(const directory_entry& d, files) 
    { 
    if(exists(d.path())) 
    { 
     cout << from_time_t(last_write_time(d.path())) << " " << d.path() << "\n"; 
    } 
    } 
}