Windows文件操作的笔记和关键,MMClassify V2.0
来源:互联网 发布:知其所以然论坛网址 编辑:程序博客网 时间:2024/06/08 14:47
之前写了一篇“MFC文件操作的笔记和关键,MMClassify”
功能:根据文件后缀 对文件进行分类。
平台: Windows。练习文件操作
不过对于之前版本的程序,路径信息是hardcode写进去程序的,后来重装系统,适应性不足的毛病出来了。
本人愚笨,花了一天时间,重写了这个程序。
用C++在Windows下以控制台形式,调用Win32 API重写了MMClassify,新版本号是V2.0
对于字符串基本的操作有了更加深刻的理解,char*, TCHAR, string , CString有了更多的理解。
代码介绍:
Path:路径,绝对全路径。例如:C:\windows\test.txt
Dir:目录,绝对目录。例如: C:\windows, 在本例中不带最后的'\\'
src:源
des:目的
没有贯彻匈牙利命名法,知道挺不好的,但是里面有太多路径字符串了,没有坚持用,或者不用。
#include <iostream>#include <fstream>#include <windows.h>using namespace std;void trim(string& 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(string& s){//转为小写,渣渣地实现了一个,不想用什么高级的方法调用 char* tmp = new char[s.length()+1]; strcpy(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;}void moveNoCover(string srcDir, string desDir){//以免覆盖同名但是不同内容的图片,简单化,本来应该做成"abc.jpg"-->"abc(3).jpg" //para1 path including fileName, but para not //取得文件名size_t nIndex = srcDir.rfind('\\');string strFileName = srcDir.substr(nIndex+1, srcDir.length()-nIndex-1);//在目标文件夹寻找有这个文件名没有string desPath = desDir+'\\'+strFileName;WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(desPath.c_str(),&FindFileData);if(hFind!=INVALID_HANDLE_VALUE){//找到 nIndex = strFileName.rfind('.'); strFileName.insert(nIndex, 1, '1');}desPath = desDir+'\\'+strFileName;//改变移动后的文件名,这样就不重复了MoveFile(srcDir.c_str(), desPath.c_str());}int main(){ fstream 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;}string line;//读取配置文件的临时变量string srcDir;//待处理图片的源目录string gifDir;//gif目标目录string picDir;//普通图片的目标目录string dirDir;//整个文件夹图片的目标目录while(getline(cfgFile,line))//其实跟EOF方法差不多,不知道这个写法有没跟EOF一样的毛病{//读取配置文件size_t pos = line.find('=');if(pos == string::npos)//not found,即是注释,或其他无意义语句 continue;string key = line.substr(0,pos);string value = line.substr(pos+1, line.length()-pos-1);trim(key);trim(value); if(key == "srcDir") srcDir = value; else if(key == "gifDir") gifDir = value; else if(key == "picDir") picDir = value; else if(key == "dirDir") dirDir = value;}//初始化文件搜索,搜索路径,文件目录项结构,句柄string searchPath = srcDir+"\\*.*";WIN32_FIND_DATA FindFileData;HANDLE hFind = FindFirstFile((char*)searchPath.c_str(), &FindFileData);do{//如果是文件夹(包括".."和"."),不作处理。后面再做处理,防止移动非网页图片文件夹if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)continue;//else all are files//get fileNamestring strFileName = FindFileData.cFileName; //get File's Suffixint nIndex = strFileName.rfind('.');string strSuffix = strFileName.substr(nIndex+1, srcDir.length()-nIndex-1);;makeLower(strSuffix);//gifif(strSuffix == "gif"){moveNoCover(srcDir+'\\'+strFileName, gifDir);}//picif(strSuffix == "jpg" || strSuffix == "jpeg" || strSuffix == "png" || strSuffix == "bmp"){moveNoCover(srcDir+'\\'+strFileName, picDir);}//dir。因为保存网页下来的图片全都是有个网页文件,配套一个文件夹存放图片的if(strSuffix == "htm" || strSuffix == "html"){//取得文件夹名字,还要创建目标目录,因为movefile函数只对文件,不会自己建立目录的。//get fileTitle. eg:"Tony" is the fileTitle of "Tony.txt".string strFileTitle = strFileName.substr(0, nIndex);string strDesDir = dirDir+'\\'+strFileTitle+"_files";CreateDirectory(strDesDir.c_str(), NULL);//初始化文件搜索,还是路径、目录项结构、句柄WIN32_FIND_DATA tmpFFD;string tmpSreachPath = srcDir+'\\'+strFileTitle+"_files\\*.*";HANDLE tmpHFind = FindFirstFile(tmpSreachPath.c_str(),&tmpFFD);//因为FindFirstFile的初始化性质,采用do-while结构do{//in this app, no dir。在预设环境下,不会有嵌套目录,所以也不会有递归if(tmpFFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)continue;string strSrcFilePath = srcDir+'\\'+strFileTitle+"_files\\"+tmpFFD.cFileName;string strDesFilePath = strDesDir+'\\'+tmpFFD.cFileName;//如果移动不成功,表示已经有了重复的,直接删除原图即可。如果移动成功,就不用删除源图了。if(!MoveFile(strSrcFilePath.c_str(), strDesFilePath.c_str()))DeleteFile(strSrcFilePath.c_str());}while(FindNextFile(tmpHFind, &tmpFFD));//最后要删除原来的目录string strSrcDir = srcDir+'\\'+strFileTitle+"_files";RemoveDirectory(strSrcDir.c_str());//把网页文件也移动过去string strSrcHtml = srcDir+'\\'+strFileName;string strDesHtml = dirDir+'\\'+strFileName;if(!MoveFile(strSrcHtml.c_str(), strDesHtml.c_str()))DeleteFile(strSrcHtml.c_str());}}while(FindNextFile(hFind, &FindFileData));}
bug, 2012.11.19
灿烂研修医.gif
猛男诞生记.gif
这两个也移动不了
发现bug,2012.11.15
有个文件不能移动:
ass-moving.gif
估计是因为 Windows的命名法。
初步尝试a-eati.gif, a-d.gif可以; adb-eating.gif不行。 会不会是超过8个字符的名字不能带'-' 呢?待续。。。。
- Windows文件操作的笔记和关键,MMClassify V2.0
- Windows文件操作的笔记和关键,MMClassify V2.1
- Windows文件操作的笔记和关键,MMClassify V2.2 V2.3
- MFC文件操作的笔记和关键,MMClassify
- .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则(转)
- 一个操作windows窗口的类“clsWindow”,使用非常方便!含源码 V2.0
- Kinect for Windows SDK v2.0 开发笔记 (一)环境
- 四、添加v2.0版本的文件
- windows内核的文件操作
- yolo v2文件结构和源码的简单梳理
- 访问form对象的关键属性和方法【学习笔记】
- Android浏览器清单文件关键配置和浏览器的调用
- Windows的关键系统组件
- 本章主要介绍C语言程序的结构和书写规则,以及Turbo C V2.0的基本操作
- 本章主要介绍C语言程序的结构和书写规则,以及Turbo C V2.0的基本操作
- 本章主要介绍C语言程序的结构和书写规则,以及Turbo C V2.0的基本操作。
- C# Kinect v2学习笔记(二) 体感器简单的操作
- 支持Windows和Linux的文件目录创建和删除操作
- Android之ListView
- DMX-SQL SERVER 数据挖掘简介一
- zoj 1789 The Suspects
- AndEngine 物理世界引擎 JNI 引入
- ImageView属性详解
- Windows文件操作的笔记和关键,MMClassify V2.0
- codeforces上解题感受
- Windows 8实例教程系列 - 开篇
- !!!Chapter 13 Copy Control
- UVa 11559 - Event Planning
- UVa 146 - ID Codes
- Eclipse自动部署项目到Tomcat的webapps下的有效方法
- 后台播放音乐,防止iphone进入休眠,超详细教程(可制作音乐闹钟)
- UVa 11340 - Newspaper