接上文《C语言实现批量截图带撕边效果》,有了上文的分析。我们就可以开始编写程序了。根据上文的分析结果,我们要实现以下几个模块。
模块一:实现目标位置的配置
模块二:实现文件名的按时间生成
模块三:执行保存文件操作
程序的配置:
如何实现目标路径的配置呢?很显然,我们希望用户可以自定义路径。要实现这一点,我们可以让用户把要设定的路径写到文本中,通过程序来读取这个文本的值,并把它设定为目标路径的值。
为了方便起见,我们首先定义一个全局结构变量。
//全局配置变量
struct Global
{
char path[256]; //目标路径
char des[256]; //目标文件名
char src[256]; //源文件路径
}config;
这样,从文件读取出来的路径,就可以保存到config.path中。
有了存储结构后,我们可以从配置文件中读出路径,并把该路径赋值给config.path。赋值完后,就可以在另外一个模块中,直接使用config.path的值了。
设置路径
void SetPath()
{
char defaultPath[] ="D:\\img";
charconfigPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,configPath);//获取当前软件的运行目录
strcat(configPath,"\\config");
char tmp[256];//存放临时读取到的文件路径
printf("\n配置的目录:%s\n",configPath);
//判断配置文件是否存在
if(CheckFile(configPath))
{
FILE * fp =fopen(configPath, "r");
if(fp !=NULL)
{
//判断读取到的文件目录是否正确
fgets(tmp,256, fp);
if(tmp[strlen(tmp)-1] == '\n')
tmp[strlen(tmp)- 1 ] = 0;
printf("\n要保存的目录:%s\n",tmp);
if(IsDir(tmp))
{
strcpy(config.path,tmp);
return;
}
}
fclose(fp);
}
//如果缺省文件目录不存在,就去创建
if(!(CheckFile(defaultPath) && IsDir(defaultPath) ) )
{
strcpy(tmp,"mkdir ");
strcat(tmp,defaultPath);
system(tmp);
}
//如果配置文件不存在,就使用缺省路径
strcpy( config.path,defaultPath );
}
上述代码中,用到了判断某一文件是否为文件夹,该函数是封装WIN32 API而来的。
判断是否为文件夹
int IsDir(char* path)
{
DWORD attr =GetFileAttributes(path);
if(attr ==INVALID_FILE_ATTRIBUTES)
{
printf("\n路径:%s 路径错误\n", path);
return 0;
}
if (attr &FILE_ATTRIBUTE_DIRECTORY)
{
return 1;
}
return 0;
}
经过上述的读取之后,接下来要做的就是,把文件A复制到文件B。我们可以用WIN32的ReadFile和WriteFile,也可以使用CopyFile.这里我们使用控制台的命令copy A B
移动文件
void ExecMove()
{
char cmd[256];
strcpy(cmd, "copy");
strcat(cmd,config.src);
strcat(cmd, "");
strcat(cmd,config.path);
strcat(cmd,"\\");
strcat(cmd,config.des);
printf("\n%s",cmd);
system(cmd);
}
在截图的时候,要完成批量截图,那么截图的命名也是我们需要考虑的。既要保证唯一,又要保证有一定的意义。所以,我们可以采用以系统时间来命名的方式。
实现命名
void SetName()
{
char tmp[10]; //临时变量,存放日期转换后的字符串
char name[256]; //目标文件名
time_t rawtime;
struct tm* timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
strcpy(name,"IMG_");
//连接年
itoa(timeinfo->tm_year+1900,tmp, 10);
strcat(name, tmp);
//连接月
itoa(timeinfo->tm_mon+1, tmp, 10);
strcat(name, tmp);
//连接日
itoa(timeinfo->tm_mday,tmp, 10);
strcat(name, tmp);
//分割符
strcat(name,"_");
//连接小时
itoa(timeinfo->tm_hour,tmp, 10);
strcat(name, tmp);
//连接分钟
itoa(timeinfo->tm_min,tmp, 10);
strcat(name, tmp);
//连接秒
itoa(timeinfo->tm_sec,tmp, 10);
strcat(name, tmp);
//加文件后缀名
strcat(name,".bmp");
strcpy(config.des,name);//配置全局的目标名
}