设计思路:将远程服务器的目录转换为一个JSON格式的字符串,然后传输到客户端。
要点
1、递归遍历服务器的目录,转换为JSON格式的字符串
2、客户端将JSON字符串还原为树结构
实现
服务器目录结构的JSON格式
{
"name":"根目录文件夹",
"files":["文件1.txt","文件2.txt"],
"dirs":[
{
"name":“""子目录1”,
"files":["子目录下的文件1.txt","子目录下的文件2.txt"]
"dirs":{}
},
... 其他子目录
]
}
"name"目录名
"files"的每一个元素都是目录下文件
"dirs"的每一个元素都是一个该目录下的子目录
创建这个JSON串的代码如下:
#include "StdAfx.h"
#include "FileCollect.h"
#include "../common/DebugMessage.h"
#include "../common/json/value.h"
#include "../common/json/reader.h"
CFileCollect::CFileCollect(void)
{
}
CFileCollect::~CFileCollect(void)
{
}
string CFileCollect::CollectFiles(const TString& folder)
{
Json::Value jv;
CollectFiles(folder,jv,folder);
return jv.toStyledString();
}
BOOL CFileCollect::CollectFiles( const TString& folder ,Json::Value& jv, const TString& relativeFolder)
{
TString CurrentFolder = folder;
BOOL bRet = FALSE;
// DebugMessage(_T("枚举目录:%s"),CurrentFolder.c_str());
//创建"name"字段,表示此目录的名字
string strName = util::string::TString2String(CurrentFolder);
strName = strName.substr(relativeFolder.length());
jv["name"] = strName;
//这个用来装文件列表
Json::Value jvArrayFiles;
//这个用来装目录列表
Json::Value jvArrayFolders;
WIN32_FIND_DATA FindFileData;
TString tmpFind(CurrentFolder);
tmpFind += _T("\\*.*");
HANDLE hFind=::FindFirstFile(tmpFind.c_str(),&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return bRet;
while(TRUE)
{
TString tmpFile(CurrentFolder);
tmpFile += _T("\\");
tmpFile += FindFileData.cFileName;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//目录
if(FindFileData.cFileName[0]!='.')
{
Json::Value tempJsonValue;
bRet = CollectFiles( CurrentFolder + _T("\\") + FindFileData.cFileName,tempJsonValue,relativeFolder);
//在目录列表中添加目录
jvArrayFolders.append(tempJsonVal