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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0710
真夏のストーブファイルハンドルが握られていても強制的に保存するには?6解決


真夏のストーブ

リンク

2016/7/10(Sun) 22:28:26|NO.76139

例えば

a=123456 bsave"a.txt",a end
というスクリプトを実行して生成された「a.txt」をメモ帳で開いて、
再度このスクリプトを実行するとエラーで落とされます。
(エラー12の「無効な名前」はファイルハンドルが握られているからだと思いますが)
では、メモ帳を開いたままこれをエラー落ちさせずに保存する方法
(あるいはエラーを回避する方法)はないでしょうか?

強制的に保存する「forcesave」命令を新しく作って使う場合
(この場合はbsave命令の全ての機能が使えてほしいです)

//(ここにforcesave命令の定義を記述) a=123456 forcesave"a.txt",a end

ファイルハンドルが握られているので、保存に失敗するというダイアログを出して
エラー落ちさせない場合
(onerrorだとエラー処理のあと、プログラムに復帰させることを避けたほうがいい
との事なのでonerrorはナシでお願いします)

a=123456 if (〜〜):dialog"保存に失敗しました"//この「〜〜」に何を入れるのか? bsave"a.txt",a

といった記述になると思います(できれば前者のforcesaveが実現できるといいです)

ご回答をよろしくお願いします。



この記事に返信する


KA

リンク

2016/7/11(Mon) 07:28:05|NO.76142

落ちないし、「メモ帳」はファイルをロックしないよ?



真夏のストーブ

リンク

2016/7/11(Mon) 08:14:02|NO.76144

申し訳ございません。
メモ帳ではなくてエクセルのようにロックするアプリケーションという想定でお願いします。



KA

リンク

2016/7/11(Mon) 10:14:21|NO.76145

ロックするのは外部からの書き換えをブロックし、ソフト内での
不整合を防止するためなので、解除して書き換えるとソフト側で
異常になったりして、後始末が大変になりますよ?

bsaveなど結果を返さない仕様を改善要求する方が妥当です。



沢渡

リンク

2016/7/11(Mon) 12:19:41|NO.76146

おお、ちょうど今作ってるソフトで、この処理やってます。
ユーザーが自前で開く可能性があるファイルを出力するときは、まずテンポラリファイルに出力し、APIのCopyFile関数を使ってコピーするという方式をとっています。


#include "kernel32.as" tmp="temp.txt" //テンポラリファイルの名前 tgt="a.txt" //出力したいファイルの名前 a="123456" //出力したいデータ bsave tmp,a //テンポラリに出力 repeat res=CopyFile(varptr(tmp),varptr(tgt),0) if res!=0 : break //問題無くコピーできた場合はループ脱出 dialog tgt+"が使用中です。\n「いいえ」で出力を中止します。",3 if stat=7 : break loop delete tmp //テンポラリを削除

これで、ファイルが使用中でコピーに失敗した場合もエラーにはならず、その旨を説明するダイアログが表示されます。

(参考)
http://hsp.tv/play/pforum.php?mode=pastwch&num=13018



沢渡

リンク

2016/7/11(Mon) 12:21:25|NO.76147

あ、bsaveの部分は
bsave tmp,a,strlen(a)
に置き換えてください。



真夏のストーブ

リンク

2016/7/11(Mon) 21:32:54|NO.76154

ありがとうございます。
「ファイルハンドルが握られているので、保存に失敗するというダイアログを出して
エラー落ちさせない場合」に相当することがこれで実現したので、解決とします。



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