Учитывая следующий код, который пытается создать 2 папки в текущем пути MATLAB:
%%
u_path1 = native2unicode([107, 97, 116, 111, 95, 111, 117, 116, 111, 117], 'UTF-8'); % 'kato_outou'
u_path2 = native2unicode([233 129 142, 230 184 161, 229 191 156, 231 173 148], 'UTF-8'); % '過渡応答'
mkdir(u_path1);
mkdir(u_path2);
первый вызов mkdir
завершается успешно, а второй терпит неудачу, при этом появляется сообщение об ошибке "Имя файла, имя каталога или синтаксис метки тома". Однако создание папок вручную на панели "Текущая папка" ([правый клик] и rArr; New Folder → [имя пасты]) не вызывает проблем. Такие сбои появляются в большинстве низкоуровневых функций ввода/вывода MATLAB (dir
, fopen
, copyfile
, movefile
и т.д.), И я хотел бы использовать все эти функции.
Среда:
- Win7 Enterprise (32 бит, NTFS)
- MATLAB R2012a
Таким образом, файловая система поддерживает символы Unicode в пути, а MATLAB может хранить истинные строки Unicode (а не "подделывать" их).
Официальная документация mkdir
элегантно {1} устраняет проблему, заявив, что правильный синтаксис для вызова функции:
mkdir('folderName')
который предполагает, что единственным официально поддерживаемым вызовом для функции является тот, который использует строковые литералы для аргумента имени папки, а не строковые переменные. Это также предложит eval
way &mdash, который я тестирую, чтобы увидеть, работает ли он, когда я пишу этот пост.
Интересно, есть ли способ обойти эти ограничения. Меня бы интересовали решения, которые:
-
не полагаются на недокументированные/неподдерживаемые материалы MATLAB;
-
не связаны с общесистемными изменениями (например, с изменением информации локали операционной системы);
-
может в конечном итоге полагаться на не-родные библиотеки MATLAB, так как полученные обработчики/объекты могут быть преобразованы в собственные объекты MATLAB и управляются как таковые;
-
может в конечном итоге полагаться на манипуляции с путями, которые могли бы сделать их пригодными для использования стандартными функциями MATLAB, даже если Windows специфична (например, пути с короткими именами).
Позже отредактируйте
То, что я ищу, - это реализации для следующих функций, которые будут затенять оригиналы в уже написанном коде:
function listing = dir(folder);
function [status,message,messageid] = mkdir(folder1,folder2);
function [status,message,messageid] = movefile(source,destination,flag);
function [status,message,messageid] = copyfile(source,destination,flag);
function [fileID, message] = fopen(filename, permission, machineformat, encoding);
function status = fclose(fileID);
function [A, count] = fread(fileID, sizeA, precision, skip, machineformat);
function count = fwrite(fileID, A, precision, skip, machineformat);
function status = feof(fileID);
function status = fseek(fileID, offset, origin);
function [C,position] = textscan(fileID, varargin); %'This one is going to be funny'
Не все типы вывода должны быть взаимозаменяемы с оригинальными функциями MATLAB, однако должны быть согласованы между вызовами функций (например, fileID
между fopen
и fclose
). Я собираюсь обновить этот список объявлений с помощью реализаций, как только я их получу/напишу.
{1} для очень свободных значений слова "элегантный".