2016-03-25 9 views
0

Ich möchte eine Kopie einer Quelldatei in einem Verzeichnis erstellen und in das Verzeichnis SAME, aber unter einem anderen Namen einfügen. Ich möchte eine Reihe von Teilnehmern durchlaufen. Der Name der Quelldatei variiert zwischen den Teilnehmern (obwohl sie immer den gleichen Beginn hat).Matlab copyfile Datei zu Datei funktioniert nicht

Ich habe die folgende Schleife geschrieben:

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 

Diese Schleife für die Untergruppe von Probanden gut funktioniert, die die gleichen Quelldateinamen haben und es erzeugt korrekt die Zieldatei im gleichen Verzeichnis wie die Quelldatei .

Jetzt, wenn ich einen Platzhalter in der Quelldatei einfügen, um mit unterschiedlichen Namen in den Quelldateien umzugehen, funktioniert die Schleife noch, aber es generiert ein neues Verzeichnis namens Zieldatei, die eine Kopie der Quelldatei (mit dem gleichen Namen) enthält. So zum Beispiel:

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 

Diese Schleife erzeugt ein neues Verzeichnis ‚FGHIJ.img‘ mit der ‚ABCDE.img“ Datei innerhalb des ‚file_root‘ Verzeichnisses

Also meine Frage ist:. Wie kann ich benutze Copyfile (Quelle, Ziel) mit einem Platzhalter in der Quelle, die eine neue Zieldatei im selben Verzeichnis erzeugt.

ich hoffe, das macht Sinn. Jede Hilfe/Vorschläge wären sehr dankbar!

Antwort

1

Bei Verwendung der Wildcard Das Zeichen copyfile setzt voraus, dass Sie mehrere Dateien in einen Ordner kopieren und das Ziel als Verzeichnis interpretieren. Sie können keine Platzhalter verwenden und eine Zieldatei festlegen. Verwenden Sie den Befehl dir, um den übereinstimmenden Dateinamen zu erhalten.

Ich empfehle fullfile auch zu verwenden Dateipfad verketten, weil sie robuster

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 
+0

Vielen Dank ist! Das hat super funktioniert. – lyd01

0

Ihr Frage macht Sinn, obwohl copyfile nicht re Erkenne * .img, um eine Wildcard darzustellen, wie du es dir vorstellst.

Ein besserer Ansatz, dies zu tun (vielleicht nicht die beste, aber was ich tun würde) ist eine Liste von Dateien innerhalb des Verzeichnisses erzeugen, die den Platzhalter * verwenden:

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