支持目录、多文件的扩展代码
2011-01-17 23:22
169 查看
原程序要扩展功能,支持右键菜单选择目录.为了减少改动,只得在接受到shell传递给程序的COPYDATASTRUCT后,处理路径字符串. 比如:path1*path2*path3……,其中path可能是文件路径,也可能是文件夹路径.需转换成文件路径的字符串,以防止大改代码,filepath1*filepath2*filepath3…….
[in] pszNodeValue 路径
[in,out] strFilePaths 指定格式字符串
[in] seperator 分隔符(如:* 或 | )
处理单个文件:
void do_findFile(char *pszNodeValue, string &strFilePaths, const char *seperator) { strFilePaths.append(pszNodeValue); strFilePaths.append(seperator); }
处理文件夹:
void do_findFilesFromDir(char *pszNodeValue,string &strFilePaths, const char *seperator) { char szFindPath[MAX_PATH]; strcpy(szFindPath,pszNodeValue); strcat(szFindPath,"//*.*"); WIN32_FIND_DATA wfd; HANDLE hFind; hFind = FindFirstFile(szFindPath,&wfd); if(hFind == INVALID_HANDLE_VALUE) return; while(TRUE) { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(wfd.cFileName[0]!='.') { char szTempDir[MAX_PATH]; strcpy(szTempDir,pszNodeValue); strcat(szTempDir,"//"); strcat(szTempDir,wfd.cFileName); do_findFilesFromDir(szTempDir,strFilePaths, seperator); } } else { strFilePaths.append(pszNodeValue); strFilePaths.append("//"); strFilePaths.append(wfd.cFileName); strFilePaths.append(seperator); } if(!FindNextFile(hFind,&wfd)) break; } FindClose(hFind); return; }
[in,out] strDest 生成的新字符串()
[in] szSrc 传入的字符串(如:path1*path2*path3)
[in] seperator 分隔符(如:* 或|)
得到了转换字符串的函数:
BOOL do_CovertPaths(string &strDest, const char *szSrc, const char *seperator) { char *pszNodeValue = strtok((char *)szSrc, seperator); while (pszNodeValue != NULL) { if (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(pszNodeValue)) do_findFilesFromDir(pszNodeValue, strDest, seperator); else do_findFile(pszNodeValue, strDest, seperator); pszNodeValue = strtok(NULL, seperator); } strDest = strDest.substr( 0, strDest.length()-1 ); return TRUE; }
总结
开始处理这个任务时,是直接在源程序的线程添加的代码——直接解析传来的字符串,把所有文件的路径添加到vector<string> vFilePaths中(是单个文件直接加入到vFilePaths中,是文件夹就调用封装好的函数,把路径加入到vFilePaths中).然后再遍历vFilePaths,处理文件.缺点:程序有4个线程,每个都要改的话,修改比较大.(原程序只支持文件、不支持目录,过程是:strtok字符串的过程中处理了文件).
教训:功能的扩展应以不大动筋骨为前提的.
相关文章推荐
- SparkContext自定义扩展textFiles,支持从多个目录中输入文本文件
- Dos递归遍历目录文件(支持环境变量延迟扩展)
- php更改目录及子目录下所有的文件后缀扩展名的代码
- 将目录下的文件按扩展名分类的bat代码
- Vs2015 本地git获取的代码目录文件修改后,启动提示error:Unable to start program “C:\Program Files\dotnet\dotnet.exe” 已解决.
- 为什么C++编译器不支持模板头文件和实现代码分离的编
- GDAL库扩展Landsat系列MTL文件格式支持
- 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
- 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历
- 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历
- Asp.net 2.0 文件下载[支持多线程, 断点续传功能](示例代码下载)
- Eclipse中python代码文件支持中文
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 删除某个目录下的所有文件及文件夹的核心代码
- 【转】Asp.net 2.0 文件下载[支持多线程, 断点续传功能](示例代码下载)
- 如何用Java代码列出一个目录下所有的文件?
- 使用CMD模式批量删除指定目录(支持目录中多层文件夹嵌套)下指定格式文件
- 该文件没有程序与之关联来运行该操作。请在控制面板的目录选项中创建关联 解决代码
- 使用java代码在本地创建文件夹(多层目录),在本地磁盘创建文件目录