saveobjオーバーロード中に読み込み中または保存中のファイル パスを取得することは可能loadobjですか?
残念ながら、matlab は保存またはロードする構造体のみを提供しますが、このパラメーターは直接提供されません。この情報を取得するためのトリックがあるかどうか疑問に思っていました。
saveobjオーバーロード中に読み込み中または保存中のファイル パスを取得することは可能loadobjですか?
残念ながら、matlab は保存またはロードする構造体のみを提供しますが、このパラメーターは直接提供されません。この情報を取得するためのトリックがあるかどうか疑問に思っていました。
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を解析するsavesaveこのメソッドは、スクリプトから呼び出している場合にのみ機能します。(ベース ワークスペースの) コマンド ラインで入力した場合は機能しません。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。