2014-07-06 75 views
1

請幫忙。 我收到了一個代碼,用於查找給定目錄中的所有文件夾,子文件夾和文件。現在我需要將它們寫入XML文檔。沒有使用解析器可能嗎?我應該添加什麼?如何從文件系統填充XML樹?

void PrintDir(char *parm) 
{ 
    WIN32_FIND_DATA FindFileData; 
    HANDLE hFind; 

    char buffer[MAX_PATH]; 
    char path[MAX_PATH]; 

    strcpy(path, parm); 
    strcat(path, "*.*"); 

    hFind = FindFirstFile(path, &FindFileData); 

    do 
    { 
     if (!strcmp(FindFileData.cFileName, ".") || !strcmp(FindFileData.cFileName, "..")) 
      continue; 

     if (FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) 
     { 
      strcpy(buffer, parm); 
      strcat(buffer, FindFileData.cFileName); 
      printf("%s\n", buffer); 
      strcat(buffer, "\\"); 
      PrintDir(buffer); 
     } 
     else 
     { 
      strcpy(buffer, parm); 
      strcat(buffer, FindFileData.cFileName); 
      printf("%s\n", buffer); 
     } 
    }while(FindNextFile(hFind, &FindFileData)); 

    FindClose(hFind); 
} 
+0

你的目標是給自己格式化並寫入XML,或者是你開到使用XML庫只是完成這項工作?相關的SO問題在這裏:[什麼是最簡單的方法來生成C++的XML?](http://stackoverflow.com/questions/303371/whats-the-easiest-way-to-generate-xml-in-c) – NicholasM

+0

I我打算使用一個庫,例如tinyXML。 –

+0

你不正確地檢查錯誤,你只是乞求緩衝區溢出。我在這裏看不到任何xml。實際上我根本看不到任何問題。 –

回答

0

嘗試是這樣的:

#include <string> 
#include <tinyxml.h> 

void PrintDir(const std::string &parm, TiXmlElement *parentElement) 
{ 
    WIN32_FIND_DATA FindFileData; 
    std::vector<std::string> subFolders, files; 

    HANDLE hFind = FindFirstFileA((parm + "*.*").c_str(), &FindFileData); 
    if (hFind == INVALID_HANDLE_VALUE) 
     return; 

    do 
    { 
     if (!strcmp(FindFileData.cFileName, ".") || !strcmp(FindFileData.cFileName, "..")) 
      continue; 

     if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
      subFolders.push_back(FindFileData.cFileName); 
     else 
      files.push_back(FindFileData.cFileName); 
    } 
    while (FindNextFile(hFind, &FindFileData)); 

    FindClose(hFind); 

    // optionally sort files... 
    // optionally sort subFolders... 

    for (std::vector<std::string>::iterator i = files.begin(), end = files.end(); i != end; ++i) 
    { 
     printf("%s%s\n", parm.c_str(), i->c_str()); 

     TiXmlElement *fileElement = new TiXmlElement("File"); 
     fileElement->SetAttribute("name", *i); 
     parentElement->LinkEndChild(fileElement); 
    } 
    files.clear(); 

    for (std::vector<std::string>::iterator i = subFolders.begin(), end = subFolders.end(); i != end; ++i) 
    { 
     printf("%s%s\n", parm.c_str(), i->c_str()); 

     TiXmlElement *fileElement = new TiXmlElement("Folder"); 
     folderElement->SetAttribute("name", *i); 
     parentElement->LinkEndChild(folderElement); 

     PrintDir(param + *i + "\\", folderElement); 
    } 
} 

TiXmlDocument doc; 
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "", ""); 
doc.LinkEndChild(decl); 

TiXmlElement *filesystem = new TiXmlElement("FileSystem"); 
doc.LinkEndChild(filesystem); 

TiXmlElement *driveElement = new TiXmlElement("Drive"); 
driveElement->SetAttribute("letter", "C"); 
filesystem->LinkEndChild(driveElement); 

PrintDir("C:\\", driveElement); 

doc.SaveFile("filesystem.xml"); 
0

我認爲最好的方法是通過文件系統「遞歸下降」。假設你想要的XML層次結構相匹配的文件系統層次,我想你可以定義下面的遞歸函數:

typedef boost::filesystem::path path; 

void appendDirectoryToXML(const path& current_directory, XMLNode& current_node) 
{ 
    for (subdirectory in directories(current_directory)) 
    { 
     subirectory_xml_entry = new XML entry created in current_node; 
     call appendDirectoryToXML(subdirectory, subirectory_xml_entry); 
    } 
    for (non_directory_file in files(current_directory)) 
    { 
     add entry for non_directory_file to current_node; 
    } 
} 

以上是僞代碼;具體細節取決於文件系統庫和您使用的XML庫的細節。