Windows文件操作的笔记和关键,MMClassify V2.2 V2.3
来源:互联网 发布:淘宝联盟qq推广教程 编辑:程序博客网 时间:2024/06/08 16:11
后来测试发现防止重命名的函数没有用递归,实际上对多次重复的文件,没有成功修改到独一的文件名。
这次更新应该算2.2版本的,但是由于瞬间又发现一个bug,没有支持宽字符,所用改成宽字符后,升级到V2.3版本
github的更新:
https://github.com/Tony36051/MMClassify
#include <iostream>#include <fstream>#include <windows.h>using namespace std;void trim(wstring& s){//去除前后的空格,自己实现了一个 int from = s.find_first_not_of(' '); int rear = s.find_last_not_of(' '); if(from == rear) return;//不加这个判断对于“ ”这个字符串会报错。不知为何 s = s.substr(from, rear - from + 1);}void makeLower(wstring& s){//转为小写,渣渣地实现了一个,不想用什么高级的方法调用 wchar_t* tmp = new wchar_t[s.length()+1]; wcscpy(tmp,s.c_str()); for(unsigned short i = 0; i < s.length(); i++) if(tmp[i]>='A'&&tmp[i]<='Z') tmp[i] += 'a'-'A'; s = tmp;}wstring fileReName(wstring strFileName, wstring desDir){//para1 path including fileName, but para2 notwstring desPath = desDir + L'\\' +strFileName;wstring strResult = strFileName;WIN32_FIND_DATAW FindFileData; HANDLE hFind = FindFirstFileW(desPath.c_str(),&FindFileData);if(hFind!=INVALID_HANDLE_VALUE){//找到 int nIndex = strFileName.rfind('.'); strFileName.insert(nIndex, 1, '1'); strResult = fileReName(strFileName, desDir);} return strResult;}void moveNoCover(wstring srcPath, wstring desDir){//以免覆盖同名但是不同内容的图片,简单化,本来应该做成"abc.jpg"-->"abc(3).jpg"size_t nIndex = srcPath.rfind('\\');wstring strFileName = srcPath.substr(nIndex+1, srcPath.length()-nIndex-1);strFileName = fileReName(strFileName, desDir);wstring desPath = desDir + L'\\' + strFileName;//改变移动后的文件名,这样就不重复了MoveFileW(srcPath.c_str(), desPath.c_str());}int main(){ wfstream cfgFile; //同目录下生成配置文件cfgFile.open("MMClassify.ini");if(!cfgFile.is_open()){//文件不存在,创建原始配置文件,返回码设1,不知有用没ofstream ofile("MMClassify.ini");ofile<<"# sourcePath"<<endl;ofile<<"srcDir = \n";ofile<<"# gif Path (Destination)\n";ofile<<"gifDir = \n";ofile<<"# common picDir (such as \"unClassified\")\n";ofile<<"picDir = \n";ofile<<"# group picDir (for example capture from webpage)\n";ofile<<"dirDir = \n";cout<<"Complete \"MMClissify.ini\" in current directry"<<endl;return 1;}wstring line;//读取配置文件的临时变量wstring srcDir;//待处理图片的源目录wstring gifDir;//gif目标目录wstring picDir;//普通图片的目标目录wstring dirDir;//整个文件夹图片的目标目录while(getline(cfgFile,line))//其实跟EOF方法差不多,不知道这个写法有没跟EOF一样的毛病{//读取配置文件size_t pos = line.find('=');if(pos == wstring::npos)//not found,即是注释,或其他无意义语句 continue;wstring key = line.substr(0,pos);wstring value = line.substr(pos+1, line.length()-pos-1);trim(key);trim(value); if(key == L"srcDir") srcDir = value; else if(key == L"gifDir") gifDir = value; else if(key == L"picDir") picDir = value; else if(key == L"dirDir") dirDir = value;}//初始化文件搜索,搜索路径,文件目录项结构,句柄wstring searchPath = srcDir+L"\\*.*";WIN32_FIND_DATAW FindFileData;HANDLE hFind = FindFirstFileW((wchar_t*)searchPath.c_str(), &FindFileData);do{//如果是文件夹(包括".."和"."),不作处理。后面再做处理,防止移动非网页图片文件夹if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)continue;//else all are files//get fileNamewstring strFileName = FindFileData.cFileName; //get File's Suffixint nIndex = strFileName.rfind('.');wstring strSuffix = strFileName.substr(nIndex+1, strFileName.length()-nIndex-1);makeLower(strSuffix);//gifif(strSuffix == L"gif"){moveNoCover(srcDir+L'\\'+strFileName, gifDir);}//picif(strSuffix == L"jpg" || strSuffix == L"jpeg" || strSuffix == L"png" || strSuffix == L"bmp"){moveNoCover(srcDir+L'\\'+strFileName, picDir);}//dir。因为保存网页下来的图片全都是有个网页文件,配套一个文件夹存放图片的if(strSuffix == L"htm" || strSuffix == L"html"){//取得文件夹名字,还要创建目标目录,因为movefile函数只对文件,不会自己建立目录的。//get fileTitle. eg:"Tony" is the fileTitle of "Tony.txt".wstring strFileTitle = strFileName.substr(0, nIndex);wstring strDesDir = dirDir+L'\\'+strFileTitle+L"_files";CreateDirectoryW(strDesDir.c_str(), NULL);//初始化文件搜索,还是路径、目录项结构、句柄WIN32_FIND_DATAW tmpFFD;wstring tmpSreachPath = srcDir+L'\\'+strFileTitle+L"_files\\*.*";HANDLE tmpHFind = FindFirstFileW(tmpSreachPath.c_str(),&tmpFFD);//因为FindFirstFileW的初始化性质,采用do-while结构do{//in this app, no dir。在预设环境下,不会有嵌套目录,所以也不会有递归if(tmpFFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)continue;wstring strSrcFilePath = srcDir+L'\\'+strFileTitle+L"_files\\"+tmpFFD.cFileName;wstring strDesFilePath = strDesDir+L'\\'+tmpFFD.cFileName;//如果移动不成功,表示已经有了重复的,直接删除原图即可。如果移动成功,就不用删除源图了。if(!MoveFileW(strSrcFilePath.c_str(), strDesFilePath.c_str()))DeleteFileW(strSrcFilePath.c_str());}while(FindNextFileW(tmpHFind, &tmpFFD));//最后要删除原来的目录wstring strSrcDir = srcDir+L'\\'+strFileTitle+L"_files";RemoveDirectoryW(strSrcDir.c_str());//把网页文件也移动过去wstring strSrcHtml = srcDir+L'\\'+strFileName;wstring strDesHtml = dirDir+L'\\'+strFileName;if(!MoveFileW(strSrcHtml.c_str(), strDesHtml.c_str()))DeleteFileW(strSrcHtml.c_str());}}while(FindNextFileW(hFind, &FindFileData));}
- Windows文件操作的笔记和关键,MMClassify V2.2 V2.3
- Windows文件操作的笔记和关键,MMClassify V2.0
- Windows文件操作的笔记和关键,MMClassify V2.1
- MFC文件操作的笔记和关键,MMClassify
- .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则(转)
- v2
- v2
- yolo v2文件结构和源码的简单梳理
- 【完整的App项目】颖火虫笔记v2
- Kinect for Windows SDK v2.0 开发笔记 (十二) 高清面部帧(3) 面部模型(2D)
- EditPlus(v2.21)的SQL语法文件
- 四、添加v2.0版本的文件
- 一个操作windows窗口的类“clsWindow”,使用非常方便!含源码 V2.0
- yolo v2 笔记
- C# Kinect v2学习笔记(二) 体感器简单的操作
- Kinect v1和Kinect v2的比较
- RGBD-SLAM V2的学习和测试
- Kinect for Windows SDK v2.0 开发笔记 (十七) 深度帧3D
- Ant学习笔记(更新中~)
- 获取Android正在运行的任务和服务
- C#中using的使用
- Core Animation 读书笔记1
- 调用MessageBox.Show没有来得及弹出对话框再次调用MessageBox.Show引起0x8000FFFF异常
- Windows文件操作的笔记和关键,MMClassify V2.2 V2.3
- 深入浅出Windows BATCH
- 使用VS2012 performance analysis tool优化你的程序 by Yan Zhao
- leetcode 14: Swap Nodes in Pairs
- bootstrap 的布局
- Linux下C语言程序开发环境
- 解决雷柏无线键鼠突然失效的问题
- JavaAndAndroid程序学习之——关闭程序和AlertDialog中的button区别
- Java_垃圾回收机制