2016-08-17 3 views
0

Итак, у меня есть довольно простая проблема, которую я пытаюсь решить. Я хочу создать резервную копию файла в MATLAB.Ошибка копирования файла MATLAB: аргумент должен содержать строку

Вот мой код (я начинаю этот скрипт из моего текущего каталога):

backup_dir=strcat(pwd,'/backups/'); 
cd('../../source_destination/'); 
source_dir=pwd; 
cd(backup_dir); 

source_files=strcat(source_dir,'/*.m'); 
source_file_list=dir(source_files); 
source_file_names={source_file_list.name}'; 

for i=1:numel(source_file_names) 
    source_file=strcat(source_dir,'/',source_file_names(i)); 
    backup_file=strcat(backup_dir,source_file_names(i)); 
    copyfile(source_file,backup_file); 
end 

Бег это дает мне ошибку:

Error using copyfile 
Argument must contain a string. 

Однако, когда я на самом деле исследовать source_file и backup_file , обе переменные возвращают действительную строку (заключенную ' '), и обе строки указывают на действительный файл:

>> source_file 

source_file = 

    '/Users/me/mydir/cool/source_destination/archive.m' 

>> backup_file 

backup_file = 

    '/Users/me/mydir/cool/world/scripts/backups/archive.m' 

Также действительный контент source_file_list действителен.

Так почему я должен получать эту ошибку?

ответ

1

Вы должны разыменовать cell содержимого массива с фигурными скобками, в противном случае strcat возвращает cell массив строк:

for i=1:numel(source_file_names) 
    source_file=strcat(source_dir,'/',source_file_names{i}); 
    backup_file=strcat(backup_dir,source_file_names{i}); 
    copyfile(source_file,backup_file); 
end 
+1

Спасибо! Наверное, я предположил (неправильно), что 'source_file_names (i)' будет возвращать строку, так как, когда я действительно показываю ее, она появилась в кавычках, а 'source_file_names {i}' не отображалась в кавычках. – Alex

+0

@Alex Действительно. Из-за гибкости, присущей массивам 'cell', они требуют специальной формы ссылки для доступа к фактическому содержимому в сравнении с общим элементом. Это то, к чему привыкнуть, но очень мощный. – TroyHaskin

+2

Я знаю, что проблема была в массиве ячеек, но вместо использования 'strcat' я предпочитаю использовать' fullfile'. ИМХО гораздо легче читать и понимать. 'fullfile (source_dir, source_file_names {i});' –

Смежные вопросы