Matlab copyfile文件无效

时间:2016-03-25 21:55:53

标签: matlab rename file-copying

我想在目录中制作源文件的副本,然后将其粘贴到SAME目录中,但名称不同。我想循环一些参与者。源文件的名称因参与者而异(尽管它始终具有相同的起始点)。

我写了以下循环:

file_root = '/pathtofile/';
sourcefile = 'ABCDE.nii';
destinationfile = 'FGHIJ.nii';

for s = 1:length(subjects) % loops over subjects
    copyfile([file_root subjects{s} '/' 'stats' '/' sourcefile], [file_root subjects{s} '/' 'stats' '/' destinationfile]);
end

此循环适用于具有相同源文件名的主题​​子集,并且它在SAME目录中正确生成目标文件作为源文件。

现在,当我在源文件中包含一个通配符来处理源文件中的不同名称时,循环仍然有效,但它会生成一个名为destinationfile的新目录,其中包含源文件的副本(具有相同的名称)。所以,例如:

file_root = '/pathtofile/';
sourcefile = 'ABCD*.img';
destinationfile = 'FGHIJ.img';

for s = 1:length(subjects) % loops over subjects
    copyfile([file_root subjects{s} '/' 'stats' '/' sourcefile], [file_root subjects{s} '/' 'stats' '/' destinationfile]);
end

此循环生成一个新目录'FGHIJ.img',其中包含'file_root'目录中的'ABCDE.img'文件。

所以我的问题是:如何在源中使用带有通配符的copyfile(源,目标),这会在同一目录中生成新的目标文件。

我希望这是有道理的。任何帮助/建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

使用通配符时,copyfile假定您正在将多个文件复制到文件夹,从而将目标解释为目录。您不能使用通配符并设置目标文件。使用dir命令获取匹配的文件名。

我还建议使用fullfile来连接文件路径,因为它更健壮

file_root = '/pathtofile/';
sourcefile = 'ABCD*.img';
destinationfile = 'FGHIJ.img';

for s = 1:length(subjects) % loops over subjects
    source_pattern=fullfile(file_root subjects{s} , 'stats' , sourcefile);
    matching_files=dir(source_pattern);
    source_file=fullfile(file_root subjects{s} , 'stats' , matching_files(1).name);
    target_file=fullfile(file_root subjects{s} , 'stats' , destinationfile)
    copyfile(source_file, target_file);
end

答案 1 :(得分:0)

虽然copyfile无法识别* .img来表示您想象的通配符,但您的问题仍然有意义。

更好的做法(可能不是最好的,但我会做的)是生成目录中的文件列表,可以使用*通配符:

file_root = '/pathtofile/';

for s = 1:length(subjects) % loops over subjects
   %create the directory for this subject
   subject_dir = fullfile(file_root,subjects{s},'stats');

   %get a struct of the .img files beginning with ABCD with the dir command
   subject_sources = dir(subject_dir,'ABCD*.img');

   %loop through the source files and copy them
   for fidx = 1:length(subject_sources)
       source_fname = subject_sources(fidx).name;

       %of course you can add lines to format/create a proper
       %destination file name. strtok, strsplit, regexp...
       dest_fname = ['FGHIJ' s(5:end)];

       copyfile(fullfile(subject_dir,source_fname),...
       fullfile(subject_dir,dest_fname)
   end
end