8-获取文件和目录信息
查看指定目录(client那端指定)下的文件
第一步解决的是如何接收到client传来的要看的文件路径,写一个函数
bool GetFilePath(std::string& strPath) { //注意这里取的是引用if ((m_packet.sCmd <= 4)&& (m_packet.sCmd >= 2)) { //查看指定目录文件,打开,下载strPath = m_packet.strData; //获取文件列表的时候return true;}return false;}
int MakeDirectoryInfo() {std::string strPath;//std::list<FILEINFO> lstFileInfos; //收集信息if (CserverSocket::getInstance()->GetFilePath(strPath) == false) {OutputDebugString(_T("当前的命令,不是获取文件列表,命令解析错误!!!"));return -1;}if (_chdir(strPath.c_str()) != 0) { //代表失效了,没有打开这个目录FILEINFO finfo;finfo.IsInvalid = TRUE; //失效finfo.IsDirectory = TRUE;finfo.HasNext = FALSE; //访问不了目录,就没有必要接下去memcpy(finfo.szFileName, strPath.c_str(), strPath.size()); //复制进去文件名//lstFileInfos.push_back(finfo);CPacket pack(2, (BYTE*)&finfo, sizeof(finfo));CserverSocket::getInstance()->Send(pack);OutputDebugString(_T("没有权限访问目录!!"));return -2;} //我没有打开这个目录依然返回消息_finddata_t fdata; //结构体int hfind = 0; //接下来就是看文件夹下没有有文件,文件树遍历下去的索引if((hfind = _findfirst("*", &fdata)) == -1){ //*配所有文件OutputDebugString(_T("没有找到任何文件!!"));return -3;}do { //有文件,默认执行了_findfirst,上面定义的fdata包含第一个文件的信息FILEINFO finfo; //定义结构体finfo.IsDirectory = (fdata.attrib & _A_SUBDIR) != 0; //看是不是文件夹属性finfo.IsInvalid = false; //有效memcpy(finfo.szFileName, fdata.name, strlen(fdata.name)); //复制文件名//lstFileInfos.push_back(finfo);CPacket pack(2, (BYTE*)&finfo, sizeof(finfo));//将这个结构体信息打包CserverSocket::getInstance()->Send(pack);//发送} while (!_findnext(hfind, &fdata));//因为文件结构是一个树,遍历//发送信息到控制端FILEINFO finfo;finfo.HasNext = FALSE; //置为false,收尾CPacket pack(2, (BYTE*)&finfo, sizeof(finfo));CserverSocket::getInstance()->Send(pack);//如果文件夹下有10000个文件怎么办(日志文件夹,临时文件夹等),切片来解决,最好是文件有一个发一个,列表的话,等全部打包完才发,会卡死return 0;
}
我们需要生成一个文件列表信息之类的传回client端
所以对于文件信息我们需要定义一个结构体
typedef struct file_info{ //struct和class很想在c++中file_info() {IsInvalid = false; IsDirectory = -1;HasNext = TRUE;memset(szFileName, 0, sizeof(szFileName));} //结构体不用析构,结构体可以构造函数初始化BOOL IsInvalid;//是不是有效的文件(快捷方式需要排除)BOOL IsDirectory;//是否为目录 0 否 1 是BOOL HasNext;//是否还有后续 0没有 1有,这个可以把前面列表注销掉char szFileName[256];//文件名}FILEINFO,*PLFILEINFO;
一开始是弄一个列表,每次文件信息push_back进去,这样的话,等到全部压完才发送,万一有10000以上个文件怎么办?
所以采取出现一个,发送一个,一个个来
_finddata_t
这个结构体是配合_findfirst
和_findnext
这系列的操作函数出现的