问题描述
个人原创,转载或引用请注明来源!
Windows电脑中,使用MATLAB对某一路径下的全部文件夹/各级子文件夹进行扫描,返回包含的全部文件,并对文件进行重复性检测,返回重复文件
代码
本代码包含3部分,主函数main,子函数file_list()、is_repeat()。
·主函数
主函数的基本原则是分层扫描,使用dir()
对当前层扫描之后将文件与文件夹分类——文件归档至file_str_total
,文件夹归档至folder_str_current
;随后对folder_str_current
包含的每个子文件夹进行扫描;每层扫描开始前,file_str_total
不清空,folder_str_current
清空。
最后对返回的文件名进行重复性判断。
%% main
% 本函数用于判断path文件夹下是否存在重复文件
% 若存在重复文件则输出重复文件与其对应的地址(repeat_record)
path='D:\Joe\Desktop';
[file_str_total,folder_str_root]=file_list(path);
folder_str_current=folder_str_root;
layer=0; % 记录子文件夹层数
tic
while(1)
layer=layer+1;
folder_str_old=folder_str_current;
folder_str_current=[];
for i=1:size(folder_str_old,1)
[file_str,folder_str]=file_list(fullfile(folder_str_old(i).folder,folder_str_old(i).name));
temp=[file_str_total;file_str];
file_str_total=temp;
temp=[folder_str_current;folder_str];
folder_str_current=temp;
end
if isempty(folder_str_current)
break;
end
end
toc
tic
repeat_record=is_repeat(file_str_total);
toc
·子函数file_list()
子函数file_list()返回path路径下的所有文件名与文件夹名的结构体,并去除‘.’和’…'的标称。
在file_list()中根据isdir
标识符判断当前值为文件还是文件夹。
%% file_list.m
% 返回path路径下的所有文件名与文件夹名的结构体,并去除‘.’和'..'的标称
function [file_str,folder_str]=file_list(path)
str=dir(path);
file_str=[];folder_str=[];
for i=1:size(str,1)
if ~(strcmp(str(i).name,'.') || strcmp(str(i).name,'..'))
if str(i).isdir==true
temp=[folder_str;str(i)];
folder_str=temp;
else
temp=[file_str;str(i)];
file_str=temp;
end
end
end
end
·子函数is_repeat
子函数is_repeat找到并返回重复的文件名的结构体。
子函数is_repeat的基本思想是先对file_str
进行去重,再使用find()
对去重前后进行对比,每次返回的索引值个数>1表示该文件存在重复。
%% is_repeat.m
% 找到并返回重复的文件名的结构体
function repeat_record=is_repeat(file_str)
name=[];
for i=1:size(file_str,1)
temp=[name;string(file_str(i).name)];
name=temp;
end
unique_name=unique(name);
repeat_seq=[];
for i=1:size(unique_name,1)
seq=find(name==unique_name(i));
if length(seq)>1
temp=[repeat_seq;seq];
repeat_seq=temp;
end
end
repeat_record=file_str(repeat_seq);
end
后
此代码可以帮助用户快速检测重复文件。
但是此代码只使用了文件名这一个维度来检测相似性,后续还可以:
- 为其添加文件大小的维度来实现更加精确的搜索功能;
- 对比文件名和文件大小的相似程度增加模糊搜索的功能。
对于本文档,如果有任何疑问或建议,欢迎留言讨论,共同进步。