我有一堆zip文件夹,我必须提取并读取数据(存储在一个唯一的文件中(。问题是,这些文件夹中的一些文件夹由于任何类型的错误而有两个文件(而不是1个(具有相同的名称。当我使用Matlab命令";解压缩";,其中一个文件被另一个文件覆盖。问题是这两个文件不一样:其中一个有我需要的信息,另一个几乎是空的。因此,我想将这两个文件重命名为file_a和file_b,提取它们,提取完后,只保留较大的一个。
你知道是否有任何方法可以重命名zip中的文件吗?
我制作了一个函数,该函数将修改zip文件中的文件名,以便可以毫无疑问地对其进行解压缩。
该函数定位zip文件中的文件名,并用一个序列"来更改它遇到的每个文件的第一个字母;A、 B、C、D等&";。
function differentiateFileNames(zipFilename)
%% get the filenames contained in the zip file
filenames = getZipFileNames(zipFilename) ;
nFiles = numel(filenames) ;
%% Find the positions of the file name fields
% read the full file as a string
str = fileread(zipFilename) ;
% if all filenames are identical, we only need to search for the first name
% in our list
idx = strfind( str , filenames{1} ) ;
%% group indices by physical file
% Each filename appears twice in the zip file:
% ex for 2 files: file1 ... file2 ... file1 ...file2
idx = reshape(idx,nFiles,2)-1 ;
%% Now modify each filename
% (replace the first character of each filename)
fid = fopen(zipFilename,'r+') ;
for k=1:nFiles
char2write = uint8('A'+(k-1)) ; % will be: A, B, C, D, ect ...
fseek(fid,idx(k,1),'bof') ;
fwrite(fid,char2write,'uint8') ;
fseek(fid,idx(k,2),'bof') ;
fwrite(fid,char2write,'uint8') ;
end
fclose(fid) ;
end
function filenames = getZipFileNames(zipFilename)
try
% Create a Java file of the ZIP filename.
zipJavaFile = java.io.File(zipFilename);
% Create a Java ZipFile and validate it.
zipFile = org.apache.tools.zip.ZipFile(zipJavaFile);
% Extract the entries from the ZipFile.
entries = zipFile.getEntries;
catch exception
if ~isempty(zipFile)
zipFile.close;
end
delete(cleanUpUrl);
error(message('MATLAB:unzip:invalidZipFile', zipFilename));
end
cleanUpObject = onCleanup(@()zipFile.close);
k = 0 ;
filenames = cell('') ;
while entries.hasMoreElements
k=k+1;
filenames{k,1} = char(entries.nextElement.getName) ;
end
zipFile.close
end
请注意,此脚本假定zip文件中的所有文件都具有相似的名称。当它定位文件名位置时,它只检查找到的第一个文件名。
子函数getZipFileNames
只是unzip.m
的一部分,只有读取zip文件中包含的文件名所需的内容。
测试:我制作了一个包含2个文件的zip文件:
New Text Document1.txt
New Text Document2.txt
我用十六进制编辑器修改了zip文件中的文件名,以便获得:
New Text Document1.txt
New Text Document1.txt
因此,这两个文件在归档中具有相同的名称。如果我试图解压缩该文件,正如您所描述的,我在输出中只得到一个文件(最后一个文件覆盖另一个(。
如果我运行differentiateFileNames(zipFilename)
,然后解压缩文件,我会在输出目录中得到两个文件:
Aew Text Document1.txt
Bew Text Document1.txt
我知道它看起来可能有点神秘,但它确保了文件的不同。如果你愿意,作为一个练习,扩展脚本直接解压缩文件,找出最大的一个,删除另一个,然后用正确的原始名称重命名剩下的文件并不需要太多时间。