本文主要是介绍Creo 二次开发-清理历史版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
利用自带的 purge.bat 可靠性更高,自己写的程序从逻辑上应该是没有问题的,没有仔细研究过自带的 purge.bat,不知道里面是否带有文件校验。
理论上来说,清理历史版本只是根据文件最后一个后缀的大小来确定保留那个文件,这一逻辑是否存在 bug 还需要继续测试。
方法一:利用 powershell 优化 Creo 自带 purge.bat
该方法在代码上很简单,先利用 purge 清理历史版本,然后再重命名小版本为 1。
印象中 Creo2.0 自带的 purge.bat 是可以直接复制到相应目录双击运行来清理小版本的,不知道 6.0 的为什么不行了。然后就用 powershell 给它套了个壳,顺便把所有小版本都改为 1。
Get-ChildItem *.* | ForEach-Object {$file = $_$file.IsReadOnly = $false
}
&'C:\Program Files\PTC\Creo 6.0.4.0\Parametric\bin\purge'
Get-ChildItem *.[0-9]* | Rename-Item -NewName {$_.fullname -replace '\.[0-9]*$' ,'.1'}
方法二:使用 c++编写可执行程序
- 遍历目录,将所有文件初始化为_FileExt 实例,存入 vector 中,按文件名顺序排序。
实际测试过程中发现,_findnext()就是按照文件名顺序,不进行手动排序也没有问题。这里为了保险,增加一步排序。
void ListFileByType(const char *path, const char *match, vector<_FileExt> &files)
{//文件句柄intptr_t hFile = 0;//文件信息struct _finddata64i32_t fileinfo; //包含中文目录,使用宽字符string p;if ((hFile = _findfirst(p.assign(path).append("\\").append(match).c_str(), &fileinfo)) != -1) //查找目录下文件,并将信息存入fileinfo{do{//排除目录if (strcmp(fileinfo.name, ".") == 0 || strcmp(fileinfo.name, "..") == 0)continue;p.assign(path).append("\\").append(fileinfo.name);_FileExt file(p.c_str());files.push_back(file); //_FileExt自建类,包含绝对路径和扩展名} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);}sort(files.begin(), files.end(), sortbyname);
}
- 将后缀转化为数字,如后缀不是数字,返回值为 0
int str2int(const string istr)
{istringstream ss;ss.str(istr);int ret = 0;ss >> ret;return ret;
}
- 遍历文件列表,比较文件名相同的两个文件的后缀,即小版本号,删除版本号较小的一个。
- 对清理后的文件重新名,将小版本号改为 1。
- 可执行程序后面可接受一个目录作为参数,实现清理指定目录。可将该可执行程序目录放入系统环境变量中方便使用
问题及解决方案
- 源码字符集和执行字符集
如果是纯英文,也就是纯 ASCII 字符,完全不用考虑编码问题,一旦涉及中文就变得非常麻烦。
按照下面文章的说法,源码文件中涉及中文时,把编码改为 utf-8 with BOM,并添加"#pragma execution_character_set(“utf-8”)",实际测试中发现,不添加#pragma 也没有异常,可能是默认的 locale 字符集就是 utf-8。测试中还发现,将源码文件改为 Unicode 也是没有问题的。
参考:C++ 编译器对字符编码的要求和处理方式 - 字符串的处理
为了简化和统一字符串的处理,当前程序第一次尝试了尽量采用 char 数组,非必要情况下不使用宽字符。
源代码
0.2purge
这篇关于Creo 二次开发-清理历史版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!