AD清理工具

需求

本文是制作了一个用于清理AD 工程的程序

使用C语言制作

清理内容包括:

  • History文件夹下的内容
  • Project Logs for xxx 文件夹下的内容
  • Project Outputs for xxx文件夹下的内容
  • 工程文件中有关输出文件内容

分析

这里以我的一个USB转4串口的工程为例

History文件夹下的是历史记录,这个文件夹会随使用越来越大,有时候上G

打包文件时需要清理

image-20250409101039254

Project Logs for xxx文件夹下的是日志文件

image-20250409101216134

Project Outputs for xxx文件夹下的是输出文件

image-20250409101247418

如果删除Project Outputs for xxx 的文件后

打开AD会有个弹窗报警告

image-20250409101626905

经分析

将工程文件以TXT打开

将这部分删除即可关闭警告

image-20250409102257014

程序

流程

  1. 扫描本文件夹内的工程文件名 (.PrjPcb)
  2. 之后打开工程文件,并建立中间文件
  3. 读取工程文件并输出到中间文件中 (当读取到上文的特殊内容时掠过即可)
  4. 删除源文件并将中间文件重命名
  5. 删除上述三个文件夹中的文件

扫描工程文件名

描述名称功能
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值