1

Is it possible to get the loading or saving file path while overloading saveobj and loadobj?

Unfortunately matlab only gives you the struct to be saved or loaded, but this parameter is not given directly to us. I was wondering if there is a trick for getting this information.

4

1 回答 1

1

用于evalc获取文件名变量

假设您正在save使用函数式语法进行调用。例如,

tt = timer; % for timer/saveobj overloaded method
fname = 'test.mat'; varname = 'tt';
save(fname,varname)

saveobj中,用于evalin获取fname变量。为了快速测试上面的例子,在第一行设置断点timer\saveobj

>> dbstop in timer\saveobj
>> save(fname,varname)
23  if isvalid(obj)
K>> fname = evalin('caller','fname')
fname =
timertest.mat
K>> 

由于save是内置命令,因此没有单独的堆栈save,并且调用者saveobj将是运行该save命令的任何人。在此示例中,它是基本工作区:

K>> dbstack
> In timer.saveobj at 23
K>> dbup
In base workspace.
K>> dbdown
In workspace belonging to timer.saveobj at 23

fname如果是完整的文件名,我很确定您知道如何获取路径,但为了完整起见,

filePath = fileparts(fname) % empty when no path specified

使用dbstackanddbtype解析save命令

此方法仅在您从脚本调用时才有效-如果在命令行上(在基本工作区中)键入save它将不起作用。save但是,它不需要文件名在变量中。

以下代码将进入您的saveobj方法:

[st,I]=dbstack('-completenames');
fname = regexp(evalc('dbtype(st(2).file,num2str(st(2).line))'),...
    '(?<=save\()(\S*)(?=,)','match','once');

例如,如果我们的测试脚本现在使用save临时文字,

>> dbstop in timer\saveobj
>> save('C:\timertest.mat',varname)
23  if isvalid(obj)
K>> st = dbstack('-completenames');
K>> fname = regexp(evalc('dbtype(st(2).file,num2str(st(2).line))'),'(?<=save\()(\S*)(?=,)','match','once')
fname =
'C:\timertest.mat'

你得到了一个字符串中的文件名,你得到了像以前一样的路径fileparts

于 2013-10-09T01:14:40.003 回答