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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0318
京浜東北・根岸線文字列から \ / : * ? \" < > | を検出したい10解決


京浜東北・根岸線

リンク

2020/3/18(Wed) 10:27:29|NO.89740

ファイル名を指定するinputを配置しています。
そこで、\ / : * ? \" < > |のどれか入力して保存すると、エラーが発生してしまいます。


path="" mes "名前を指定" input path,100,20,32 button "Save",*go stop *go if peek(path, ) = '\\' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '/' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = ':' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '*' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '?' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '"' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '<' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '>' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop if peek(path, ) = '|' : dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")":stop dialog "保存完了"
これだと、「\aaa」なら保存を防げるのですが、
「aaa\」だと、保存を続行してしまいます。
どうしたら\ / : * ? \" < > |があったら保存を防げることができるのでしょうか
(補足)
「フツーにdialogの17使えよ」て思われそうですが、
今、HSPスクリプトエディタの「外部ツール」的な機能を作っている最中でして、
dialog使うと、指定のディレクトリ以外のディレクトリに保存できてしまいます。



この記事に返信する


リンク

2020/3/18(Wed) 10:48:28|NO.89741

#include "mod_regexp.as"
として、match関数を使い、
"[\\\\\\/:\\*\\?"<>|]"
みたいな感じでひっかければいける気がします。動かしてはいないので、ちゃんとひっかからないものがあったら、適宜調整してください。



リンク

2020/3/18(Wed) 10:49:46|NO.89742

すいません。1箇所間違いを発見した。
"[\\\\\\/:\\*\\?\"<>|]"
じゃないとエラーになっちゃいます。



リンク

2020/3/18(Wed) 10:53:49|NO.89743

あと、確かファイル名には , とか ; とかもだめだった気がするので、なにが使えないかを調べて、それを全部入れることを推奨します。どこかにリストがあった気がしましたが、忘れちゃいました。



よっぴー

リンク

2020/3/18(Wed) 13:37:54|NO.89744

試してませんが、instrでだめな文字列を検索して、
返ってきた数値が-1じゃなければエラーを出すというのはどうでしょう。



沢渡

リンク

2020/3/18(Wed) 22:08:11|NO.89747

(なぜか)peekの第2パラメータが省略されていますが、
これだと第2パラメータに0を指定したとみなされるので、
pathの先頭の文字しかチェックできません。

では、repeatを使ってpathの全文字をチェックすれば……と言いたいところですが、
標準のHSPで使われているShift_JISでは2バイト文字(漢字など)の
2バイト目にも0x5C('\\')や0x7C('|')等が来る可能性があります。
(俗に言う『ダメ文字』)
このように考えると、やはりinstrで検索するというのが簡単だと思います。

list="\\/:*?\"<>|" sea="" //検索用文字列変数 path="" mes "名前を指定" input path,100,20,32 button "Save",*go stop *go flag=0 //不味い文字が使われたフラグ repeat 9 poke sea,0,peek(list,cnt) //seaにlistのcntバイト目をコピー if instr(path,0,sea)!=-1 { dialog "ファイル名に使用できない文字が含まれています。\n\\ / : * ? \" < > | は使用できません。\n("+path+")" flag=1 break } loop if flag=0 : dialog "保存完了" stop

>猫さん
「,」や「;」はファイル名に使えますが。



GENKI

リンク

2020/3/18(Wed) 22:25:31|NO.89749

同じ様な質問が昔もあったような気がしつつも、過去ログ確認せずにさくっと調べてみました。
https://dobon.net/vb/dotnet/file/invalidpathchars.html


#include "mod_regexp.as" fname = "c:\\hogehoge\\fugafuga?.txt" ;\ / : * ? \" < > grep = "[\\x00-\\x1f<>:\"/\\\\|?*]" grep += "|^(CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9]|CLOCK\\$)(\\.|$)" grep += "|[\\. ]$" res = match(fname, grep, 0, 1) mes res
すでにレスがついている通り、正規表現でチェックする方法だとシンプルに記述できます。(正規表現文字列がほとんど呪文でシンプルじゃない点はさておき。)

また、ちゃんと理解してプログラム書きたい場合は、これもすでにレスが付いている通りinstrがおすすめです。



リンク

2020/3/18(Wed) 23:35:38|NO.89750

セミコロンとカンマが打てなかったのは、私が使っていたファイル管理ソフト側の使用のようでした。セミコロンは許されるそうです。失礼しました!
https://stackoverflow.com/questions/3869594/semi-colons-in-windows-filenames
でも、環境変数はセミコロンでフォルダを区切っているし、大丈夫なのかな…というのが不思議ではあります。



ゆうやん

リンク

2020/3/18(Wed) 23:46:35|NO.89751

一応、ファイル名に使えない記号だけでなく、ファイル名につけられない名前もあるので、注意した方がいいと思います。
https://nj-clucker.com/cannot-create-file-name-on-windows/



沢渡

リンク

2020/3/19(Thu) 08:44:48|NO.89753

>猫さん
申し訳ありません、よく確認しないでレスしてしまいました。
確かにコンマやセミコロンは名前に使えますが、かつては使えない時代もありましたし、
環境変数やコマンドラインとの絡みで非推奨であるようです。
(他には半角の%なども非推奨)
https://all.undo.jp/asr/1st/document/01_03.html



京浜東北・根岸線

リンク

2020/3/20(Fri) 11:11:12|NO.89761

みなさん、ありがとうございました。
これで、使用禁止文字を使用した際に
保存を防げるシステムが完成しました



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