据我所知,在大多数情况下,您可以使用以下代码完成工作:
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));
答案 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