背景
我在函数" matfile"中遇到了一些奇怪的行为。在Matlab 2016b中 - 不确定发生了什么,我无法复制或创建测试用例。
我有一个结构,我将其保存到服务器中,如下所示:
PathToFile='ServerPath\My Documents\MyProj\testMatF.mat';
save(PathToFile,'-struct','myStruct'); %I tried the -v7.3 flag
问题
然后我用以下内容阅读:
m1=matfile(PathToFile);
在其他非常相似的结构上,我可以这样做:
myFields=fieldnames(m1);
但对于这个文件我不能,我得到的只是汽车"属性"字段。
我尝试了什么
myFields=who(m1)
- 给我一些字段名称...有时候。我不太了解who
函数,但似乎如果我穿插who m1
,那么myFields=who(m1)
就可以了。
明确输入m1.TheFieldName
,有效。
将文件移动到comp上的某个位置,例如C:\Data\
。然后使用fieldnames
工作。
使用load
,有效。
是否与服务器访问,损坏的文件,matfile属性有关?另一个奇怪的事情是我在这个特定文件夹中的一些.m文件,当我尝试打开它们时导致:Does not exist
,当它显然时,因为我点击它并可以使用run
功能...附加:Windows 7.最近更新的许可证。
请告诉我您可以使用哪些信息来提供帮助。要么创建一个可以工作的新文件,要么修复当前文件的问题。感谢。
修改
命令窗口中的示例输出 - 看似难以理解......
M1 = matfile(完整文件(projPath,' NexusMarkersProcessed.mat'),'可写',假)
m1 =
matlab.io.MatFile
属性: Properties.Source:' \ bontempi.medicine.utorad.utoronto.ca \ home \ PT \ zabjeklab3 \ My Documents \ Data \ Active Projects \ JC_Hip \ FL1502 \ FL1502 \ Patient 分类2 \ NexusMarkersProcessed.mat' Properties.Writable:false
方法
K>> m1.Properties.Source
ans =
\ bontempi.medicine.utorad.utoronto.ca \家\ PT \ zabjeklab3 \我的 Documents \ Data \ Active Projects \ JC_Hip \ FL1502 \ FL1502 \ Patient 分类2 \ NexusMarkersProcessed.mat
K>>的java.io.File(m1.Properties.Source).exists()
ans =
逻辑
0
暂停在此窗口中粘贴...返回:
的java.io.File(m1.Properties.Source).exists()
ans =
逻辑
1
K>>谁(M1)
您的变量是:
患者10患者5患者9患者11患者6患者3 患者7
K>>谁(m1)K>>谁(m1)K>> 的java.io.File(m1.Properties.Source).exists()
ans =
逻辑
0
K>>
因此它有时会找到该文件,并且可以将其读入.Othertimes它不能 - 这与它在网络驱动器上的事实有关吗?
感谢任何帮助。
答案 0 :(得分:0)
此问题是由访问网络驱动器上的文件引起的。一种解决方法是将文件复制到本地驱动器(使用C:
),然后使用matfile
,根据需要使用结果,然后替换网络驱动器文件,并删除本地文件,把东西归还原状。一些研究让我意识到,如果任何文件,甚至.m
文件都在网络上,事情就会比它们需要的慢。这是一个有效的功能:
function [m,noData]=safeMatFile(FilePath,safeFilePath)
%FilePath: absolute path to where the file is on the network
%safeFilePath: absolute path to where the file will be temporarily copied locally, C://
%safeDir='C:\Data';
%safeFold='tempFolder12345679';
%[~,tempDir,~]=mkdir(safeDir,safeFold);
%safeFilePath=fullfile(safeDir,safeFold,FileName);
noData=0;
dirFile=dir(FilePath);
if (length(dirFile) == 1) && ~(dirFile.isdir)%OR java below OR exist(forceFilePath,'file')==2
%if there is a file, make a temp folder on the C drive
if ~(java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile()) %ensure file doesn't exist, check dir too: || isempty(tempFolder)
copyfile(FilePath, safeFilePath);%moves existing file to backup folder
else
warning('SKIPPING (%s) - an old file of the same name was there, delete it!\n',safeFilePath);
return
end
%Load the temp local file into matlab
m=matfile(safeFilePath,'Writable',true);
else
m=[];
noData=1;
end
end
然后使用m
进行操作......最后:
function overwriteOldFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(FilePath).delete();
java.io.File(safeFilePath).renameTo(java.io.File(FilePath));
end
end
和
function deleteTempFiles()
if (java.io.File(safeFilePath).exists() && java.io.File(safeFilePath).isFile())
java.io.File(safeFilePath).delete();
end
end
...如有必要,请rmdir
。
注意,我尝试了不同的方法来检查文件是否存在(我认为第一个是最快且最可靠的):
dirFile=dir(FilePath); if (length(dirFile) == 1) && ~(dirFile.isdir)
if (java.io.File(FilePath).exists() && java.io.File(FilePath).isFile())
if exist(FilePath,'file')==2