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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1022
赤松他のドライブからbcopyできない9未解決


赤松

リンク

2016/10/22(Sat) 11:00:53|NO.77213

前の質問が解決したばかりで申し訳ないです。
以前質問させていただいたmp3プレーヤーのbcopyのことで質問があります
教えていただいた通りに

dialog "mp3" , 16 , "音声ファイル" if stat = 1:bcopy refstr ,""+dir_exe+"\\music.mp3" chdir dir_exe
とdir_exeをつけることでdialogを出した後でもちゃんと移動できるようになったのですが
色々試していたら他のドライブからコピーするとエラー12が出てしまうことに気がつきました。
具体的にはS:/file.mp3からF:/MP3Player/file.mp3に、などです。
自力で解決してみようと思い現在は仕方なくbloadしてbsave、という形でやっていますが
bcopyでできないものでしょうか?bload、bsaveだと容量の大きいファイルをコピーしたときに
応答無しになったりファイルが壊れたりすることが多いのでbcopyを使用してコピーしたいです。



この記事に返信する


MillkeyStars

リンク

2016/10/22(Sat) 13:50:17|NO.77214

music.mp3 を既に開いている可能性はありませんか?
music.mp3 が使用されている場合、読み込み専用属性となります。

スクリプトを複数実行されている、mci などがすでにメディアをロードなどしている場合は
ファイルは保護されファイル上書き処理などは、できなくなります。
この場合、ファイルへ書き込みできないので bcopy は エラー12 を表示します。



MillkeyStars

リンク

2016/10/22(Sat) 13:59:29|NO.77215

前回の回答と今回のでのエラーになる可能性での追記です。
HSP の mci 命令は、プロセス終了時にロードされたハンドル(管理番号)を自動的に閉じません。
自身で閉じないとエラーの原因となりますので、必ずスクリプトで終了処理を行ってください。


onexit *script_end stop *script_end mci "close movie" //"close movie" = alias movie としてロードしたメディアを閉じる mci "close all" //"close all" = このプロセスでロードしたすべてのメディアを閉じる end



赤松

リンク

2016/10/22(Sat) 18:33:41|NO.77219

コードをかなり削ってしまったのでわかりづらいですね、すみません
実際には

*select1 mci "close 1" dialog "mp3" , 16 , "音声ファイル" if stat = 1:bcopy refstr ,""+dir_exe+"\\1.mp3" chdir dir_exe mci "open 1.mp3 alias 1" stop *select2 mci "close 2" dialog "mp3" , 16 , "音声ファイル" if stat = 1:bcopy refstr ,""+dir_exe+"\\2.mp3" chdir dir_exe mci "open 2.mp3 alias 2" stop *select3 mci "close 3" dialog "mp3" , 16 , "音声ファイル" if stat = 1:bcopy refstr ,""+dir_exe+"\\3.mp3" chdir dir_exe mci "open 3.mp3 alias 3" stop *select4 mci "close 4" dialog "mp3" , 16 , "音声ファイル" if stat = 1:bcopy refstr ,""+dir_exe+"\\4.mp3" chdir dir_exe mci "open 4.mp3 alias 4" stop
のようにcloseしてからコピー、終わってから再度openするようにしていました
あと、bcopyできないのは他のドライブからに限ります。
D:/musics/ongaku.mp3からD:/mp3player/1.mp3などは問題なくコピーされます

onexit&close allのことは枠無しウィンドウを使っている関係上、閉じるボタンをbutton命令で出しているので
閉じるボタンのジャンプ先にendの前に加えています。

ちゃんと質問のときにコードを極端に端折らずに書かなければいけませんね
もし必要ならば全体のコードと動作に必要なファイルを纏めて上げます



MillkeyStars

リンク

2016/10/23(Sun) 02:52:34|NO.77220

スクリプトは問題ないので、他のドライブのアクセス権周りなのかなー。
問題切り分け用のスクリプトを置いておきます。

#module Testbcopy #define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 #define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 #define FILE_ATTRIBUTE_NORMAL 0x00000080 #uselib "kernel32.dll" #cfunc _Ts_MoveFileEx "MoveFileExA" sptr,sptr,int #cfunc _Ts_GetLastError "GetLastError" #func _Ts_FormatMessage "FormatMessageA" sptr,sptr,sptr,sptr,sptr,sptr,sptr #cfunc _Ts_CopyFile "CopyFileA" sptr,sptr,sptr #func _Ts_SetFileAttributes "SetFileAttributesA" sptr,sptr #deffunc bcopy_chk str p1,str p2 Refval = _Ts_CopyFile(p1,p2,0) if Refval == 0{ DLL_Err = _Ts_GetLastError() ErrString = "ファイルコピーでエラー 12 が発生しています。詳細は下記の通りです。\n\nGetLastError = " //GetLastError の文字列を取得 sdim GetErrString,65535 sdim SPString,65535 _Ts_FormatMessage FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,DLL_Err,0,varptr(GetErrString),65535,0 dialog strf("%s 0x%08x\n%s",ErrString,DLL_Err,GetErrString),1,"bcopy エラー" } else { _Ts_SetFileAttributes p2,FILE_ATTRIBUTE_NORMAL } return #global screen 0,800,600,0 font "MSゴシック",12 onexit *p_end mci "open \""+dir_exe+"\\1.mp3\" alias 1" mci "play 1" button "切り替え",*Music_Load mes "Process Start" stop *Music_Load mci "close 1" mes "dialog 前 : "+dir_cur+" / "+refstr dialog "mp3",16,"音声ファイル" if stat = 0 : mes "キャンセルされました" : stop mes "dialog 後 : "+dir_cur+" / "+refstr bcopy_chk refstr ,""+dir_exe+"\\1.mp3" chdir dir_exe mes "再生先 : "+dir_exe+"\\1.mp3" mci "open \""+dir_exe+"\\1.mp3\" alias 1" : mes "stat : "+stat+" / "+wparam mci "play 1" stop *p_end mci "close 1" mci "close all" end



赤松

リンク

2016/10/23(Sun) 09:30:55|NO.77224

実行してみると
GetLastError=0x0000007b
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
とのことで、これが起きる条件を探してみたところ

・コピー元/先が極端に深いディレクトリ
・Cドライブ以外からCドライブへのコピー
・アラビア語のような変わった2byte文字が入ったフォルダの中

で出ました。
すべて同じエラーでした
Cドライブからはどこでもコピーできて
CドライブにはCドライブからしかコピーできない
という感じなのでアクセス権周りの問題ですか?
これはhspのスクリプトでなんとかできるものなのでしょうか。



MillkeyStars

リンク

2016/10/23(Sun) 12:05:50|NO.77227

>>・コピー元/先が極端に深いディレクトリ
ANSI (Shift-JIS) でのファイルコピーは、最大 260バイト(NULL終端文字を含む)に制限されます。
この制限を解除するには、UNICODE 版を使用してください。
となっているので、文字数が多い深い階層のフルパスでは、コピーができません。

>>・アラビア語のような変わった2byte文字が入ったフォルダの中
これは、単純に文字が認識できないのでコピーができないだけです。
この場合も同様に、ファイルオープンダイアログを UNICODE 版に切り替えないといけません。



赤松

リンク

2016/10/23(Sun) 14:12:26|NO.77228

>・Cドライブ以外からCドライブへのコピー
がなぜ出来ないのでしょうか?



MillkeyStars

リンク

2016/10/26(Wed) 05:09:03|NO.77238

ファイル元とファイル先と、各種権限でアクセスしてみればいい。
というか、それしか確認する方法がない。

CreateFile がそれに相当する WinAPI だから、それを使用して確認するしかない。
https://msdn.microsoft.com/ja-jp/library/cc429198.aspx

>>・Cドライブ以外からCドライブへのコピー
これだけは、あなたのPC でしか検証ができないので、答えはでません。



KA

リンク

2016/10/26(Wed) 06:26:15|NO.77239

エクスプローラーでも同様なのかで変わります。



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