Учитывая следующий код, который пытается создать 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
завершается успешно, а второй завершается ошибкой с сообщением об ошибке "Неверный синтаксис имени файла, имени каталога или метки тома". Однако создание папок вручную на панели графического интерфейса «Текущая папка» ([щелчок правой кнопкой]Новая папка[вставить имя]) не вызывает проблем. Такого рода сбои появляются в большинстве низкоуровневых функций ввода-вывода MATLAB (dir
, fopen
, copyfile
, movefile
и т. д.), и я хотел бы использовать все эти функции.
Окружающая среда:
- Win7 Корпоративная (32-разрядная, NTFS)
- МАТЛАБ R2012a
таким образом, файловая система поддерживает символы Unicode в пути, и MATLAB может хранить настоящие строки Unicode (а не «подделывать» их).
mkdir
официальная документация элегантно{1} обходит проблему, заявляя что правильный синтаксис для вызова функции:
mkdir('folderName')
что предполагает, что единственный официально поддерживаемый вызов функции — это тот, который использует строковые литералы в качестве аргумента имени папки, а не строковые переменные. Это также предполагает eval
способ, который я тестирую, чтобы проверить, работает ли он, пока пишу этот пост.
Интересно, есть ли способ обойти эти ограничения. Меня интересуют решения, которые:
не полагайтесь на недокументированные/неподдерживаемые материалы 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} для очень расплывчатых значений слова "элегантный".