Matfile 未加载结构的字段名称

Matfile isn't loading the structure's field names

背景

我在 Matlab 2016b 中遇到函数 "matfile" 的一些奇怪行为 - 不确定发生了什么,我无法复制它或创建测试用例。

我有一个结构,我将其保存到服务器,如下所示:

PathToFile='ServerPath\My Documents\MyProj\testMatF.mat';
save(PathToFile,'-struct','myStruct'); %I tried the -v7.3 flag

问题

然后我读入:

m1=matfile(PathToFile);

在其他非常相似的结构上,我可以这样做:

myFields=fieldnames(m1);

但是对于这个文件我不能,我得到的只是自动 "Properties" 字段。

我试过的

  1. myFields=who(m1) - 给我字段名列表......有时。我不太了解 who 的功能,但似乎,如果我穿插 who m1 然后 myFields=who(m1) 就可以了。

  2. 显式键入 m1.TheFieldName,有效。

  3. 将文件移动到 comp 上的某个位置,如 C:\Data\。然后使用 fieldnames 工作。

  4. 使用 load,有效。

是否与服务器访问、损坏的文件、matfile 属性有关?另一件奇怪的事情是我在这个特定文件夹中的一些 .m 文件,当我尝试打开它们时结果是:Does not exist,显然是这样,因为我单击它并可以使用 run使用它的功能...附加:Windows 7. 最近更新的许可证。

请让我知道您可以使用哪些信息来提供帮助。要么创建一个可以工作的新文件,要么修复当前文件的问题。谢谢。


编辑

我的命令中的示例输出 window - 看似不可理解...

m1=matfile(fullfile(projPath,'NexusMarkersProcessed.mat'),'Writable',false)

m1 =

matlab.io.MatFile

Properties: Properties.Source: '\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient Classification 2\NexusMarkersProcessed.mat' Properties.Writable: false

Methods

K>> m1.Properties.Source

ans =

\bontempi.medicine.utorad.utoronto.ca\home\PT\zabjeklab3\My Documents\Data\Active Projects\JC_Hip\FL1502\FL1502\Patient Classification 2\NexusMarkersProcessed.mat

K>> java.io.File(m1.Properties.Source).exists()

ans =

logical

0

暂停粘贴此window...返回:

java.io.File(m1.Properties.Source).exists()

ans =

logical

1

K>> who(m1)

Your variables are:

Patient10 Patient5 Patient9 Patient11 Patient6 Patient3
Patient7

K>> who(m1) K>> who(m1) K>> java.io.File(m1.Properties.Source).exists()

ans =

logical

0

K>>

所以它有时会找到文件,并且可以读入它。有时它不能 - 这是因为它在 网络驱动器 上吗?

感谢任何帮助。

此问题是由访问网络驱动器上的文件引起的。一种解决方法是将文件复制到本地驱动器(使用C:),然后使用matfile,根据需要使用结果,然后替换网络驱动器文件,并删除本地文件,以return 东西恢复原状。一些研究让我意识到,如果网络上有任何文件,即使是 .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