MATLAB自动化复制模型文件

最近临近毕业季,工作也找了,毕业论文还不着急写,没啥事干。晓得每年导师都会让我们把仿真模型和代码整理好,就想着先干这个。可是打开电脑硬盘才发现,模型文件有好多种,.hfss .aedt .m文件等,文件夹里还有子文件夹,子子文件夹,还要逐个跳过仿真的解文件。我这么懒的人怎么可能干这种重复性劳动的手动活呢?

待整理文件夹

于是我就想,用MATLAB查找指定的主文件夹里面所有子文件夹并将其整理为一个数组,然后使用循环在每一个子文件夹中寻找某一类型后缀名文件,并将满足要求的文件路径放进一个元胞数组里面,然后用copyfile函数将元胞数组里面的路径文件一个个复制到指定的大目录下,在复制前用下面这段代码进行文件夹的创建。

if ~exist(DST_PATH)
    mkdir(DST_PATH);
end

这里面需要思考的是如何将主文件夹下的多层子文件夹里面符合后缀名的文件的路径给提出来!接下来详细讲解代码的实现。

1. 获得文件夹下所有子文件的路径

p = genpath('G:\HJH');% 获得文件夹下所有子文件的路径,这些路径存在字符串p中,以';'分割
Workspace

从工作区的变量可以看出,利用genpath函数返回的是所有子文件夹的路径,但这个路径是以;连接的,我们需要将其分割开来,构建为一个元胞数组。

length_p = size(p,2);%字符串p的长度
path = {};%建立一个元胞数组,数组的每个单元中包含一个目录
temp = [];
for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
    if p(i) ~= ';'
        temp = [temp p(i)];
    else 
        temp = [temp '\']; %在路径的最后加入 '\'
        path = [path ; temp];
        temp = [];
    end
end  
clear p length_p temp;
分隔开的路径

接下来我们对每个子文件夹符合要求的文件进行筛选。

2. 逐一文件夹读取指定类型文件绝对路径

接下来,我们利用dir函数对某一类型后缀名的文件进行筛选,本来想尝试dir(strcat(file_path,{'*.hfss';'*.aedt';'*.m'}))操作,但是这个函数貌似不支持这样。因此干脆每一类文件筛选完路径后,再加一行进行另一类型文件的搜索,并追加于file_path_list后面。最后file_path_list就是当前第i个文件夹所有满足要求的文件路径。我们在循环外面设置一个元胞数组变量file_name_array,用count统计最后所有满足要求的文件总数目,并在Command Window实时显示处理进度,最后将所有匹配的文件路径写入到指定路径的txt文件中当做执行日志。

%至此获得文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。
%下面是逐一文件夹中读取指定类型文件
file_name_array={};
file_num = size(path,1);% 子文件夹的个数
count=0;
disp('------显示处理前文件的路径------');
for i = 1:file_num
    file_path =  path{i}; % 指定类型文件夹路径
    %任意添加所要搜索的文件类型
    file_path_list = dir(strcat(file_path,'*.hfss'));
    file_path_list = [file_path_list;dir(strcat(file_path,'*.aedt'))];
    file_path_list = [file_path_list;dir(strcat(file_path,'*.m'))];
    
    file_num = length(file_path_list); %该文件夹中指定类型文件数目
    if file_num > 0
        for j = 1:file_num
            file_name = file_path_list(j).name;% 文件名
            count=count+1;
            file_name_array(count,1)={strcat(file_path,file_name)};
            fprintf('%d %s\n',count,file_name_array{count});% 显示处理前文件的路径
            %指定类型文件处理过程 省略
        end
    end
end
%%txt写入路径信息
fid=fopen('C:\Users\admin\Desktop\test1.txt','wt');%改为你自己文件的位置
for num=1:count
    fprintf(fid,'%d %s\n',num,file_name_array{num});    
end
fclose(fid);

到这一步,事情还没完。我们只是将路径给提取出来了,最后一步我们要将这些绝对路径的文件给复制到指定文件夹下。

3. 自动化复制绝对路径下的文件

直接将绝对路径的文件复制到一个文件夹下,势必会很混乱,而且不像之前那样分类好。最重要的是我不同文件夹会有相同文件名的文件,这就很尴尬了。为了保证不出现复制的主目录下充斥各种类型文件,并防止同名文件覆盖。最后一步需要解决根据每个文件的绝对路径,在复制主目录下创建文件夹。例如有一个文件名绝对路径为:

G:\HJH\FILE\temp1\temp2\combine_anyPort_for_radiationPattern.m

我希望将其复制到D:\temp下去,最后实现D:\temp\FILE\temp1\temp2\combine_anyPort_for_radiationPattern.m
要达到这种效果,只需要regexp函数对指定分割符进行字符串分割,然后将G:\HJH替换成D:\temp,最后用fullfile将前面主目录和后面分割好的字符串进行重组即可。

disp('------显示处理后文件的路径------');
DST_NAME_array={};
for num=1:count    
    S = regexp(file_name_array{num,1}, '\', 'split');
    DST_PATH = 'D:\temp';%目的文件目录  
    DST_PATH = fullfile(DST_PATH, S{3:end-1});%DST_Path有N层,这里的3就改为N+1,我这里 'D:\temp'只有2层所以是3
    if ~exist(DST_PATH)
        mkdir(DST_PATH);
    end

    DST_NAME=fullfile(DST_PATH, S{end});
    DST_NAME_array(num)={DST_NAME};
    fprintf('%d %s\n',num,DST_NAME);% 显示处理后文件的路径
    copyfile(file_name_array{num,1},DST_NAME);
end
%%txt写入路径信息
fid=fopen('C:\Users\admin\Desktop\test2.txt','wt');%改为你自己文件的位置
for num=1:count
    fprintf(fid,'%d %s\n',num,DST_NAME_array{num});    
end
fclose(fid);

整段代码如下:

clear;clc;
p = genpath('G:\HJH');% 获得文件夹下所有子文件的路径,这些路径存在字符串p中,以';'分割
length_p = size(p,2);%字符串p的长度
path = {};%建立一个元胞数组,数组的每个单元中包含一个目录
temp = [];
for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
    if p(i) ~= ';'
        temp = [temp p(i)];
    else 
        temp = [temp '\']; %在路径的最后加入 '\'
        path = [path ; temp];
        temp = [];
    end
end  
clear p length_p temp;
%至此获得文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。
%下面是逐一文件夹中读取指定类型文件
file_name_array={};
file_num = size(path,1);% 子文件夹的个数
count=0;
disp('------显示处理前文件的路径------');
for i = 1:file_num
    file_path =  path{i}; % 指定类型文件夹路径
    %任意添加所要搜索的文件类型
    file_path_list = dir(strcat(file_path,'*.hfss'));
    file_path_list = [file_path_list;dir(strcat(file_path,'*.aedt'))];
    file_path_list = [file_path_list;dir(strcat(file_path,'*.m'))];
    
    file_num = length(file_path_list); %该文件夹中指定类型文件数目
    if file_num > 0
        for j = 1:file_num
            file_name = file_path_list(j).name;% 文件名
            count=count+1;
            file_name_array(count,1)={strcat(file_path,file_name)};
            fprintf('%d %s\n',count,file_name_array{count});% 显示处理前文件的路径
            %指定类型文件处理过程 省略
        end
    end
end
%%txt写入路径信息
fid=fopen('C:\Users\admin\Desktop\test1.txt','wt');%改为你自己文件的位置
for num=1:count
    fprintf(fid,'%d %s\n',num,file_name_array{num});    
end
fclose(fid);

disp('------显示处理后文件的路径------');
DST_NAME_array={};
for num=1:count    
    S = regexp(file_name_array{num,1}, '\', 'split');
    DST_PATH = 'D:\temp';%目的文件目录  
    DST_PATH = fullfile(DST_PATH, S{3:end-1});%DST_Path有N层,这里的3就改为N+1,我这里 'D:\temp'只有2层所以是3
    if ~exist(DST_PATH)
        mkdir(DST_PATH);
    end

    DST_NAME=fullfile(DST_PATH, S{end});
    DST_NAME_array(num)={DST_NAME};
    fprintf('%d %s\n',num,DST_NAME);% 显示处理后文件的路径
    copyfile(file_name_array{num,1},DST_NAME);
end
%%txt写入路径信息
fid=fopen('C:\Users\admin\Desktop\test2.txt','wt');%改为你自己文件的位置
for num=1:count
    fprintf(fid,'%d %s\n',num,DST_NAME_array{num});    
end
fclose(fid);

代码视频展示GIF图:

MATLAB寻找文件.gif

喜欢的朋友可以收藏哦,代码可以直接用,改下路径和需要寻找的文件后缀名即可!

个人名片

姓名 毕业院校 专业 专业技能
小辉 电子科技大学(本科+硕士) 电磁场与微波技术 HFSS,CST,FEKO,AutoCAD,MATLAB(GUI),Python

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350