1

saveobjオーバーロード中に読み込み中または保存中のファイル パスを取得することは可能loadobjですか?

残念ながら、matlab は保存またはロードする構造体のみを提供しますが、このパラメーターは直接提供されません。この情報を取得するためのトリックがあるかどうか疑問に思っていました。

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

dbstackとを使用してコマンドdbtypeを解析する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 に答える