HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
1022
hkrdelete命令の動作が不安定?バグ?4未解決


hkr

リンク

2025/10/22(Wed) 20:59:31|NO.104111

プログラムAからプログラムBに対してストレージを介してデータを
やり取りしていますが、まれにプログラムBのdelete命令で、
「ファイル名が異常もしくはファイルが存在しない」
エラーが発生します。

プログラムA

FILE = strf("%s\\SEND.TXT", dir_cur) DAT = "hoge" : notesel DAT : notesave FILE

プログラムB

FILE = strf("%s\\SEND.TXT", dir_cur) repeat exist FILE : if strsize >= 0 : break loop DAT = "" : notesel DAT : noteload FILE exist FILE : if strsize >= 0 : delete FILE

SSDをすり減らすのでHDDで作業しているのですが、発生する条件がいまいち特定できなくて
苦戦しています。ソケットやらメモリ通信は別用途で既に使用しているのであくまでも
ファイルでやりとりを行いたいのです。
ちなみにSSDドライブで試してもエラーが発生する事は確認しています。

現状ではonerror命令でトラップして再試行とか試しているのですが、推奨は速やかな
END命令ですし、なにかうまい回避方法があれば良いのですが・・・

今考えてるのはAPIを叩いて消すか強制的なキャッシュクリア辺りかと思ってますが
なんか納得いかないというか、実際にエクスプローラでファイルの存在は確認できるので
悪いのはexistじゃなくてdeleteじゃないかなー?という…



この記事に返信する


zrs90(5さい)

リンク

2025/10/22(Wed) 23:18:47|NO.104112

コレ症状が似てませんか?対策がヒントになるかも
(サイト内検索で見てると思いますが)
https://hsp.tv/play/pforum.php?mode=pastwch&num=54071



zakki

リンク

2025/10/23(Thu) 19:22:22|NO.104113

notesaveでアトミックにファイルが保存されるわけじゃありませんし、existsからdeleteをアトミックにやる方法もないので
A: ファイルを開く
B: ファイルができたのを確認
B: 書き込み中のファイルを読む
B: ファイルを消そうとする→ Aが使ってるので失敗
A: ファイルを書き込む
A: ファイルを閉じる
みたいな順番になると駄目ですね。A側には別名で保存しておいてリネームっていう回避方法はあります。

B側の別の可能性としてはWindowsでは利用中のファイルは消せませんが、閉じた直後のファイルの削除にも失敗するっていう挙動もあります。
(最近もそうかは知りません)
ちょっと待ってから再試行が定番なんですが、HSPだとこの辺のファイル操作を安全に書けない書きづらいっていうのがあって、
例外じゃなくてstatか何かで失敗を返してくれるモードあってもいいのになとは思います。
返り値チェック忘れてエラーに気付かないこと防ぐ簡単さとのトレードオフでしょうか。

https://stackoverflow.com/questions/1753209/deletefile-fails-on-recently-closed-file



hkr

リンク

2025/10/27(Mon) 17:45:29|NO.104152

ありがとうございます。

やっぱり「書き込み中」の問題が真っ先に思い浮かぶのですが、
その前のnoteloadでEOFまで正常に受け取れてるんですよねー。

あと追加情報ですが、削除命令実行前に一旦notesave命令で空ファイルで上書きしてから
削除を試してみましたが、同じエラーが発生しました。

ってなわけで、頂いた情報を参考に試してみようと思う対策は2種。

1:プログラムA側で一旦別名で保存してからリネーム
2:プログラムA側で保存したファイルサイズが予定通りか確認する
3:プログラムB側でファイルサイズが3回安定したら削除

1案が確実な気がしないでもないですが、fxren命令は実質ファイルのコピーらしいので
msvcrt.dllのrenameファンクションを叩いたほうが確実・・・なのかな?

2案は1案と複合で試してみようかと

3案はとりあえず書いてみた感じですが、noteload命令が通ってる時点で
解決策にはなってないかもなー。
しかも3回waitで待機入れるのは処理落ちの原因にもなるし・・・

っていうか過去ログでも触れられていましたが、delete命令失敗時にstatじゃなくて
エラーで帰るのが最大の問題点ですよねー。



hkr

リンク

2025/10/27(Mon) 17:52:45|NO.104153

あれ?投稿してから気が付いたのですが、noteload命令って対象ファイルを
一旦ロックするんですかね?

これが原因ならnoteloadからのnotesizeでexistの結果と照合してから
削除という手段も取れそうですが・・・そもそもたかが数キロバイトのテキストの
読み込みでこれほど神経質にならなければならないのだろうかorz



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.104111への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.