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

你可能感兴趣的:(MATLAB自动化复制模型文件)