鉴于以下代码尝试在当前 MATLAB 路径中创建 2 个文件夹:
%%
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
调用成功,第二次调用失败,并显示错误消息“文件名、目录名或卷标语法不正确”。但是,在“当前文件夹”GUI 面板中手动创建文件夹([右键单击]⇒新建文件夹⇒[粘贴名称])不会遇到问题。这种故障出现在大多数 MATLAB 的低级 I/O 函数(dir
、fopen
、copyfile
等movefile
)中,我想使用所有这些函数。
环境是:
- Win7 企业版(32 位,NTFS)
- MATLAB 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
between fopen
and fclose
)。我将在获取/写入后立即使用实现更新此声明列表。
{1}用于“优雅”一词的非常宽松的含义。