Matlab copyfile 文件到文件不起作用

Matlab copyfile file to file not working

我想复制一个目录中的源文件并将其粘贴到同一目录中,但名称不同。我想遍历许多参与者。源文件的名称因参与者而异(尽管它始终具有相同的开头)。

我写了以下循环:

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

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

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

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(source, destination),它会在同一目录中生成新的目标文件。

我希望这是有道理的。任何 help/suggestions 将不胜感激!

虽然 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

使用通配符时,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