ファイルが作られるまで待つ方法

23 visualizaciones (últimos 30 días)
Kazu Ari
Kazu Ari el 3 de Nov. de 2022
Comentada: Kazu Ari el 3 de Nov. de 2022
予めMATLABスクリプトを実行しておき、他のソフトウェアが計算結果のファイルを出力したらそれをMATLABで読み込んで処理を行いたいです。
ファイルの有無はexistで確認できるのは解りましたが、その後が判りません。
n=10;
while exist '[ファイル名]'<>0
pause(n)
end
では上手く行かないことは試しました。
何か良い方法はありますでしょうか?

Respuestas (2)

Hernia Baby
Hernia Baby el 3 de Nov. de 2022
returnでループから脱出するといけると思います。
n = 10;
cnt = 0;
while true
cnt = cnt + 1;
if cnt == 10
return
end
fprintf('計算中:%i\n',cnt)
pause(0.5)
end
disp('計算終了')
  1 comentario
Kazu Ari
Kazu Ari el 3 de Nov. de 2022
早速の回答ありがとうございます。
trueの所にfileの有無をチェックする方法を入れるのですね。
そもそもwhileの使い方を理解していなかったようです。(VBAと同じ感覚でいました)
今後ともよろしくお願いします。

Iniciar sesión para comentar.


Atsushi Ueno
Atsushi Ueno el 3 de Nov. de 2022
% exist name は、name のタイプを数値として返します。このリストは、各値に関連付けられたタイプを示します。
% 0 — name が存在しないか、他の理由で見つかりません。たとえば、name が MATLAB® のアクセスできない制限付きフォルダーに存在する場合、exist は 0 を返します。
% 1 — name はワークスペースの変数です。
% 2 — name は拡張子が .m、.mlx または .mlapp のファイルです。あるいは、name は未登録のファイル拡張子 (.mat、.fig、.txt) をもつファイルの名前です。
% 3 — name は MATLAB 検索パス上の MEX ファイルです。
% 4 — name は読み込まれた Simulink® モデル、あるいは MATLAB 検索パス上にある Simulink のモデルまたはライブラリ ファイルです。
% 5 — name は組み込み MATLAB 関数です。これにクラスは含まれません。
% 6 — name は MATLAB 検索パス上の P コード ファイルです。
% 7 — name はフォルダーです。
% 8 — name は、クラスです (-nojvm オプションを使用して MATLAB を起動した場合、関数 exist は Java クラスを表す 0 を返します)。
while exist '[ファイル名]'<>0 は
while ~exist('[ファイル名]','file') と書くべきです
while ~isfile('[ファイル名]') の方がより良いと思います それぞれの理由は下記の通りです
  • exist関数の戻り値が0以外の(何か存在する)間繰り返す事になるので、演算子(<>)の意味が逆(==)です
  • その演算子(<>)は、MATLABの演算子ではありません。MATLABで <> に該当する演算子は ~= です
  • while文の式は「真か偽か」を入力します
  • 「while exist( __ ) ~=0」は「while exist( __ )」と同じです
  • 「while exist( __ ) ==0」は「while ~exist( __ )」と同じです(MATLABのチルダ(~)は否定(!)を表す演算子です)
  • 括弧の無い関数構文は後に続く文字が引数とみなされる為、while文と組み合わせて書けません
  • exist関数の判定対象はファイル名だけではないので「0以外」で判断するのは適当ではありません
  • ('file'オプションで判定対象をファイルに絞る事が有効です。拡張子を含めて記述すれば問題無いです)
  • R2017b以降ではisfile関数で当該ファイルがある(1)か無い(0)かを判定した方が目的に適って良いです
cnt = 0;
while ~isfile('test.txt') % 当該ファイルが存在しない間繰り返す
cnt = cnt + 1
if cnt == 3 % 例として3回繰り返し待った時点で他のソフトウェアが当該ファイルを出力した事にする
fclose(fopen('test.txt', 'w')); % ファイル test.txt を作成する (開いて即閉じる)
end
% Hernia Babyさんの回答の様にいくら待ってもファイルが存在しない場合はループを抜ける処理を入れると良いです
end
cnt = 1
cnt = 2
cnt = 3
ls -la % ファイル test.txt が存在する(存在するからwhileループを抜けた)
total 8 drwxr-xr-x 2 mluser worker 4096 Nov 3 11:46 . drwx------ 1 mluser worker 4096 Nov 3 11:46 .. -rw-r--r-- 1 mluser worker 0 Nov 3 11:46 test.txt
fileID = [];
while isempty(fileID)
try % 他のソフトウェアが計算結果のファイルを出力していて、まだファイルを閉じてないかもしれないのでtryする
fileID = fopen('test.txt', 'r'); % ファイル test.txt を開く
fclose(fileID); % 用事が無いのでファイル test.txt を閉じる
catch ME
pause(0.5); % ファイルオープンに失敗したら様子を見る
end
end
fileID % fopen関数がファイルを開いたら 3 以上の整数のファイル識別子を返す
fileID = 3
  1 comentario
Kazu Ari
Kazu Ari el 3 de Nov. de 2022
詳細な解説ありがとうございます。
自身の知識のなさが情けないですが、皆様のおかげで勉強できています。
今後ともよろしくお願いします。

Iniciar sesión para comentar.

Etiquetas

Productos


Versión

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!