现在的位置: 首页 > 综合 > 正文

使用C++把文件夹目录信息转化为XML文件

2013年12月18日 ⁄ 综合 ⁄ 共 2006字 ⁄ 字号 评论关闭

因为项目需要,要把服务器上的一个目录转化为一个超级简单的XML文件,然后下载到客户端后,显示到树控件上,希望这样能够提高客户端显示目录的速度。原来的设计是每次打开目录都要连接服务器去读。上次已经完成了XML文件的解析,这次完成XML的生成。生成XML使用了Win32中很经典的查找文件的函数:FindFirstFile和FindNextFile。代码中还使用了SetCurrentDirectory和GetCurrentDirectory来设置文件的查找路径,减少了字符串处理。

要使用下面的代码,只需要这样调用即可:

SetCurrentDirectory(_T("D://Test"));
TraverseDirectory(_T("D://Test"));

/* Recursively traverse a directory and its subdirectories. */
BOOL TraverseDirectory(LPCTSTR lpszDirectory)
{
    HANDLE SearchHandle;
    WIN32_FIND_DATA FindData;
    TCHAR CurrPath[MAX_PATH 
+ 1];
    
static int tabCnt = 0
;

    if (!lpszDirectory)
        
return
 FALSE;

    out << "<DirectoryList Name="" << lpszDirectory << "">" << endl;

    GetCurrentDirectory (MAX_PATH, CurrPath);
    CString strPath(CurrPath);
    if (strPath.Right (1!= _T ("//"
))
        strPath 
+= _T ("//"
);
    strPath 
+= _T ("*.*"
);

    /* Open up the directory search handle and get the first file name to satisfy the path name. */
    SearchHandle 
= FindFirstFile(strPath, &FindData);
    
if (SearchHandle ==
 INVALID_HANDLE_VALUE) {
        
return
 FALSE;
    }
    
/* Scan the directory and its subdirectories. */

    
do {
        
if (strcmp(FindData.cFileName, "."== 0 || strcmp(FindData.cFileName, ".."== 0
)
            
continue
;
        
if (FindData.dwFileAttributes &
 FILE_ATTRIBUTE_DIRECTORY) {
            
++
tabCnt;
            
for (int i = 0; i != tabCnt; ++
i)
                
out << ' '
;
            
            
int idx = strPath.ReverseFind('//'
);
            CString strChildPath 
= CString(strPath, idx + 1
);
            strChildPath 
+=
 FindData.cFileName;
            SetCurrentDirectory(strChildPath);

            /* Traverse the subdirectory recursively. */
            TraverseDirectory(FindData.cFileName);
            SetCurrentDirectory(_T(
".."
));
        }
        
/* Get the next file or directory name. */

    } 
while (FindNextFile(SearchHandle, &FindData));
    FindClose(SearchHandle);
    
for (int i = 0; i != tabCnt; ++
i)
        
out << ' '
;
    
out << "</DirectoryList>" <<
 endl;
    
--
tabCnt;

    return TRUE;
}

抱歉!评论已关闭.