<span style="font-family: Arial, Helvetica, sans-serif;">由于整理图片需要用到一些简单的文件处理操作,将遇到的tips记录下来,以备后用:</span>
1、关于新建文件夹
char num_tmp[10];
itoa(j,num_tmp,10);
char *new_dir="F://gt_db//";
string my_dest_dir=dest_dir+num_tmp+"//";
char char_dest_dir[50];
strcpy(char_dest_dir,new_dir); //字符串复制
strcat(char_dest_dir,num_tmp); //字符串连接
if (_mkdir( char_dest_dir ) == 0) //新建文件夹
利用上面程序可以循环新建文件夹 ,需要用到头文件 #include <direct.h>。 如果此文件夹已存在,则不会在新建。上面程序中还含有简单的字符串操作。
2、关于在文件中续写:
<pre name="code" class="cpp">file.open("annotation.txt",ios::app);
上面这句话可以实现在文件中续写内容,不过这个文件事先建立好(我是这么做的),需要的时候直接打开就行。起作用的就是后面的ios::app。
3、保存图片:
Mat faceRGB=img(maxface);
imwrite(my_dest_dir+imgname,faceRGB);
第一句是从原图中截图去骗,maxface是cv::rect的变量,img为cv::mat的文件。
第一个参数为图片全路径名(包括位置和文件名),第二个参数为mat图片。
4、删除文件操作:
string deleteimg_str=my_src_dir+imgname;
const char *deleteimg=deleteimg_str.c_str();
if (DeleteFile(deleteimg))
printf("Removed %s.\n",deleteimg_str);
else
perror("remove"); return 0;
开始用的是remove函数,提示无法删除;于是就用了DeleteFile函数,但是注意里面的参数为LPCSTR格式,我用的是const char*,在项目设置中设置字符集为未设置,默认是使用Unicode的,这个地方注意改一下,改为未设置。在Debug下可以用const char*作为DeleteFile的参数,但是在Release模式下需要用下面6点所说的LPCSTR格式的。
5、图片保存:
imwrite(my_dest_dir+"//"+imgname,img);
用imwrite保存图片,发现一个问题就是原图为18.9k,保存后新图30多k。而且如果原来保存的位置含有文件名相同的文件们,则会进行替换。
6、关于string到的LPCSTR转换:
string deleteimg_str=my_src_dir+imgname;
const char *deleteimg=deleteimg_str.c_str();
size_t size = deleteimg_str.length();
wchar_t *buffer = new wchar_t[size+1];
MultiByteToWideChar( CP_ACP, 0, deleteimg_str.c_str(), size, buffer, size * sizeof(wchar_t) );
buffer[size] = 0; // 确保以 '\0' 结尾
buffer中就含有需要的LPCSTR格式内容,用完后记得delete buffer;
7、DeleteFile一直无法删除:
用GetLastError函数查看,在Visual C++ 中,可以在监视窗口添加 $err,hr 一行来实时显示错误。发现错误代码是5,就是【5】-拒绝访问。所以修改文件夹属性。
8、不适用imwrite来幅值图片,同样适用于一般文件的复制:
_mkdir( char_dest_dir );
string OldFileName=src_dir+imgname;
string NewFileName=my_dest_dir+"//"+imgname;
LPCTSTR lpOldFileName=OldFileName.c_str();
LPCTSTR lpNewFileName=NewFileName.c_str();
CopyFile(
lpOldFileName, //pointer to name of an existing file
lpNewFileName, //pointer to filename to copy to
TRUE //flag for operation if file exists 设为TRUE表示目标文件存在的话就复制失败
);
使用的是Copyfile函数。