得到'文件' Matlab中的路径

时间:2018-03-16 12:26:20

标签: matlab

据我所知,在大多数情况下,您可以使用以下代码完成工作:

mydocpath = fullfile(getenv('USERPROFILE'), 'Documents');

但是,如果用户已经移动了' Doucments'文件夹到其他位置,例如:E:\Documents,上述代码无法正常工作,因为getenv('USERPROFILE')始终返回C:\Users\MY_USER_NAME

在C#中,可以使用Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),它始终返回正确的路径,无论在哪里'文档'是。 Matlab中有类似的内容吗?

我目前的解决方案相当笨拙且可能不安全:

% search in the MATLAB path lists
% this method assumes that there is always a path containing \Documents\MATLAB registered already
searchPtn = '\Documents\MATLAB';
pathList = strsplit(path,';');
strIdx = strfind(pathList, searchPtn);
candidateIdx = strIdx{find(cellfun(@isempty,strIdx)==0, 1)}(1);
myDocPath = pathList{candidateIdx}(1 : strIdx{candidateIdx}+ numel(searchPtn));

1 个答案:

答案 0 :(得分:2)

根据@excaza的建议,我想出了一个使用dos的解决方案,并找到了here cmd命令来查询注册表。

% query the registry
[~,res]=dos('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal');
% parse result
res = strsplit(res, ' ');
myDocPath = strtrim(res{numel(res)});

修改

如果客户PC中的文档文件夹尚未重新定位或移动到其中一个环境路径(如%SYSTEMROOT%),则上述方法将返回

%SOME_ENVIRONMENT_PATH%/Documents(Or a custom folder name)

上述路径在Matlab的函数(如mkdir或exists)中不起作用,它将%SOME_ENVIRONMENT_PATH%作为文件夹名称。因此,我们需要检查返回值中是否存在环境路径并获取正确的路径:

[startidx, endidx] = regexp(myDocPath,'%[A-Z]+%');
if ~isempty(startidx)
    myDocPath = fullfile(getenv(myDocPath(startidx(1)+1:endidx(1)-1)), myDocPath(endidx(1)+1:end));
end

完整代码:

% query the registry
[~,res]=dos('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal');
% parse result
res = strsplit(res, ' ');
% get path
myDocPath = strtrim(res{numel(res)});
% if it returns %AAAAA%/xxxx, meaning the Documents folder is
% in some environment path.
[startidx, endidx] = regexp(myDocPath,'%[A-Z]+%');
if ~isempty(startidx)
    myDocPath = fullfile(getenv(myDocPath(startidx(1)+1:endidx(1)-1)), myDocPath(endidx(1)+1:end));
end