需求
本文是制作了一个用于清理AD 工程的程序
使用C语言制作
清理内容包括:
History
文件夹下的内容Project Logs for xxx
文件夹下的内容Project Outputs for xxx
文件夹下的内容- 工程文件中有关输出文件内容
分析
这里以我的一个USB转4串口的工程为例
History
文件夹下的是历史记录,这个文件夹会随使用越来越大,有时候上G打包文件时需要清理
Project Logs for xxx
文件夹下的是日志文件
Project Outputs for xxx
文件夹下的是输出文件
如果删除
Project Outputs for xxx
的文件后打开AD会有个弹窗报警告
经分析
将工程文件以TXT打开
将这部分删除即可关闭警告
程序
流程
- 扫描本文件夹内的工程文件名 (
.PrjPcb
) - 之后打开工程文件,并建立中间文件
- 读取工程文件并输出到中间文件中 (当读取到上文的特殊内容时掠过即可)
- 删除源文件并将中间文件重命名
- 删除上述三个文件夹中的文件
扫描工程文件名
描述 | 名称 | 功能 |
---|---|---|
char * | out | 输出文件名 |
char * | path | 扫描路径和内容 |
int | 输出 | 错误码 |
int scan_file(char *out, char *path)
{
// const char *path = "*.PrjPcb";
intptr_t handle; // 用于查找的句柄
struct _finddata_t fileinfo; // io.h
handle = _findfirst(path, &fileinfo); // 第一次查找
if (handle == -1)
return -1;
strcpy(out, fileinfo.name);
_findclose(handle);
return 0;
}
操作文件
描述 | 名称 | 功能 |
---|---|---|
char * | file_name | 文件名 |
void operate_file(char *file_name)
{
FILE *fp;
FILE *ftemp;
char buf[200];
int i = 0;
fp = fopen(file_name, "r+");
ftemp = fopen(file_temp_name, "w+");
if (fp == NULL)
return;
while (1)
{
memset(buf, 0, 200);
if (fgets(buf, 199, fp) == NULL)
break;
if (strstr(buf, "[GeneratedDocument") != NULL)
{
printf("%s", buf);
i = 4;
}
if (i)
i--;
else
fputs(buf, ftemp);
}
fclose(fp);
fclose(ftemp);
}
原理是 扫描
[GeneratedDocument
这个特殊字符串 这个字符串所在行和以下3行不写入新文件
删除文件
这部分是调用win的
del
命令先扫描文件夹的名称,得到上述两个以
Project
开头的文件夹的全名之后调用
del
命令即可
void del_file(void)
{
const char *path = "Project *";
char buf[1000];
memset(buf, 0, 300);
strcpy(buf, "del /s /q \"History\"\n");
system(buf);
intptr_t handle; // 用于查找的句柄
struct _finddata_t fileinfo; // io.h
handle = _findfirst(path, &fileinfo); // 第一次查找
if (handle == -1)
return;
do
{
memset(buf, 0, 1000);
sprintf(buf, "del /s /q \"%s\"\n", fileinfo.name);
system(buf);
// printf("%s\n", buf);
} while (!_findnext(handle, &fileinfo));
_findclose(handle);
}
删除源文件和重命名
// 删除源文件
memset(buf, 0, 300);
sprintf(buf, "del %s", file_name);
system(buf);
// 重命名
memset(buf, 0, 300);
sprintf(buf, "rename " file_temp_name " %s", file_name);
system(buf);
源码
#include <stdio.h>
#include <io.h>
#include "string.h"
#include <stdlib.h>
#define file_temp_name "HZ_temp"
int scan_file(char *out, char *path)
{
// const char *path = "*.PrjPcb";
intptr_t handle; // 用于查找的句柄
struct _finddata_t fileinfo; // io.h
handle = _findfirst(path, &fileinfo); // 第一次查找
if (handle == -1)
return -1;
strcpy(out, fileinfo.name);
_findclose(handle);
return 0;
}
void operate_file(char *file_name)
{
FILE *fp;
FILE *ftemp;
char buf[200];
int i = 0;
fp = fopen(file_name, "r+");
ftemp = fopen(file_temp_name, "w+");
if (fp == NULL)
return;
while (1)
{
memset(buf, 0, 200);
if (fgets(buf, 199, fp) == NULL)
break;
if (strstr(buf, "[GeneratedDocument") != NULL)
{
printf("%s", buf);
i = 4;
}
if (i)
i--;
else
fputs(buf, ftemp);
}
fclose(fp);
fclose(ftemp);
}
void del_file(void)
{
const char *path = "Project *";
char buf[1000];
memset(buf, 0, 300);
strcpy(buf, "del /s /q \"History\"\n");
system(buf);
intptr_t handle; // 用于查找的句柄
struct _finddata_t fileinfo; // io.h
handle = _findfirst(path, &fileinfo); // 第一次查找
if (handle == -1)
return;
do
{
memset(buf, 0, 1000);
sprintf(buf, "del /s /q \"%s\"\n", fileinfo.name);
system(buf);
// printf("%s\n", buf);
} while (!_findnext(handle, &fileinfo));
_findclose(handle);
}
int main(void)
{
char file_name[200];
char buf[300];
memset(file_name, 0, 200);
if (scan_file(file_name, "*.PrjPcb") != 0)
{
printf("no file\n");
return -1;
}
printf("file: %s\n", file_name);
operate_file(file_name);
// 删除源文件
memset(buf, 0, 300);
sprintf(buf, "del %s", file_name);
system(buf);
// 重命名
memset(buf, 0, 300);
sprintf(buf, "rename " file_temp_name " %s", file_name);
system(buf);
// printf("OK");
del_file();
return 0;
}