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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0912
黒目フォルダの移動が上手くいかない8解決


黒目

リンク

2013/9/12(Thu) 01:29:36|NO.57095

 重ね重ねの質問申し訳ありません。今現在IEのお気に入り内にあるファイルとフォルダを
用意したフォルダ内にあるものと入れ替えることでIEのお気に入りを偽装するツールを制作
しております。ファイルの入れ替えはできたのですが、フォルダの移動は途中で止まるなど、
不安定なのです。拙作ですが、ソースを載せますのでどなたか不具合の原因と解決策を教授
して頂けませんか?何卒よろしくお願いします。


#uselib "shell32" #func global SHFileOperation "SHFileOperation" sptr #module #deffunc DirCopy str FromFolder,str ToFolder,int mode //DirCopy 引用元 http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200801/08050033.txt //mode=1 にするとFromFolder(フォルダ)をToFolder(フォルダ)に移動します From= FromFolder : To= ToFolder SHFILEOPSTRUCT = hwnd, mode, varptr.From, varptr.To, $150, -1, 0, 0 SHFileOperation varptr.SHFILEOPSTRUCT return #global title "" screen 0,200,200 button goto "置換",*tikan button goto "起動",*kidou button goto "確認",*kakunin f1 = dirinfo($10006) s1 = dir_exe + "\\処理用" k1 = dir_exe + "\\格納庫" f3 = dirinfo($10006) + "\\Links" s3 = dir_exe + "\\処理用\\バー" k3 = dir_exe + "\\格納庫\\バー" stop // step0 フォルダのチェック *tikan title "置換中" chdir dir_exe : dirlist x,s1,5 If stat = 0 : mkdir "処理用" chdir dir_exe : dirlist x,k1,5 If stat = 0 : mkdir "格納庫" chdir s1 : dirlist x,s3,5 If stat = 0 : mkdir "バー" chdir k1 : dirlist x,k3,5 If stat = 0 : mkdir "バー" // step1 お気に入り→処理用 title "置換中・" chdir f1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt f2 = dirinfo($10006) + "\\" +fname If fname = "Links" : goto *skip //Linksの挙動がつかめないので、別で処理する dircopy f2,s1,1 *skip wait 10 loop chdir f3 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt f4 = dirinfo($10006) +"\\Links\\" +fname dircopy f4,s3,1 //Linksは特別扱い?なのでその中身だけをバーに移動させます wait 1 loop // step2 格納庫→お気に入り title "置換中・・" chdir k1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt k2 = dir_exe + "\\格納庫" + fname If fname = "バー" : goto *skip2 dircopy k2,f1,1 *skip2 wait 1 loop chdir k3 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt k4 = dir_exe + "\\格納庫\\バー\\" +fname dircopy k4,f3,1 //バーからバーに移動させます wait 1 loop // step3 処理用→格納庫 title "置換中・・・" chdir s1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt s2 = dir_exe + "\\処理用" + fname If fname = "バー" : goto *skip3 dircopy s2,k1,1 *skip3 wait 1 loop chdir s3 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt s4 = dir_exe + "\\処理用\\バー\\" +fname dircopy s4,k3, ////バーからバーに移動させます wait 1 loop title "" stop *kidou exec "iexplore",16 stop *kakunin exec f1,,"explore" exec s1,,"explore" exec k1,,"explore" stop



この記事に返信する


KA

リンク

2013/9/12(Thu) 10:07:11|NO.57098

何だか危ういので試せませんが、「お気に入りフォルダ」の「中身」だけ処理すれば
良いのでは?

特殊属性のフォルダ自体を操作するのは、止した方が良いでしょう。



Humi

リンク

2013/9/12(Thu) 10:38:05|NO.57099

一応やりましたが
「お気に入り」内が荒れましたww
まずLinksでのエラーは吐き出しませんでした。
でもファイルのツリーを全部調べ切ってません。
このソースだと。

だから、ファイルの移動が途中で終わっている(ようにみえたり)
移動されないファイルがでてきます(した)

ファイルコピーの時に
フォルダを列挙 -> またそのフォルダの中のフォルダを列挙……
というふうにマトリョーシカみたいな構造にしなければなりません。

最後に俺の作ったファイル列挙のアルゴリズムのせときますね。一応。
うまく使ってくださいな

sdim list EnumFiles list, dirinfo($10006) + "\\", "*.*" mesbox list, ginfo(12), ginfo(13), 5, 0 #module #uselib "shlwapi.dll" #cfunc PathIsDirectory "PathIsDirectoryA" sptr #deffunc EnumFiles var buf, str directory, str extention sdim buf :sdim list :sdim list2 :sdim file :sdim ext file = directory ext = extention repeat await if cnt != 0 { notesel list if notemax == 0 :break noteget file, 0 notedel 0 } if PathIsDirectory(file) { // フォルダの場合 dir = file chdir dir dirlist list2, ext, 2 // 子を列挙 notesel list2 repeat notemax // フルパスで格納 noteget file, cnt list += ""+dir+file if PathIsDirectory(dir+file) :list += "\\" list += "\n" loop }else { // ファイルの場合 buf += ""+file+"\n" } loop return #global



黒目

リンク

2013/9/12(Thu) 13:28:24|NO.57102

KA様
お気に入りとLinksという特殊属性のフォルダの操作はこのソースではしてないですよね?

Humi様
実はファイル移動は別に行っています。そっちは機能していたので、そこの部分を省略していました。
一応ここに載せておきます。

全体の流れとして、お気に入り内のファイルのみを処理用フォルダに移動、
次にLinks内のファイルのみを処理用\バーに移動、次にお気に入り内のLinksを
除いたフォルダだけを処理用に移動。さらに、Links内のフォルダを処理用\バーに移動。

この操作をお気に入り、処理用、格納庫という3つのフォルダを使って行うことで、
お気に入り内と格納庫内を総入れ替えできるようにしたいんです。

そのために何故フォルダ内のフォルダを全部調べ切れてないのかをご説明願えますか?


#module #deffunc allmove str p1, str p2 chdir p1 notesel list dirlist list,"*.*",1 repeat notemax noteget fname,cnt from = p1 + "\\" +fname to = p2 + "\\" +fname bcopy from,to delete from wait 10 loop return #global // 変数 f = dirinfo($10006) s = dir_exe + "\\処理用" k = dir_exe + "\\格納庫" f2 = dirinfo($10006) +"\\Links" s2 = dir_exe + "\\処理用\\バー" k2 = dir_exe + "\\格納庫\\バー" // step1 お気に入り→処理用----------------------------------------------------------------------------- allmove f,s allmove f2,s2 // step2 格納庫→お気に入り----------------------------------------------------------------------------- allmove k,f allmove k2,f2 // step3 処理用→格納庫----------------------------------------------------------------------------- allmove s,k allmove s2,k2 end



黒目

リンク

2013/9/13(Fri) 00:49:40|NO.57113

Humi様

補足ですがこのソースで使われているdircopyはフォルダの中身(ファイルでもフォルダでも)
も含めてフォルダをコピーできることを確認しています。

ですのでフォルダの中のフォルダを列挙していく必要はないと思います。



Humi

リンク

2013/9/13(Fri) 12:00:44|NO.57119

黒目さん
すいません。
「お気に入りバー」っていうのがLinksだったんですねww
俺の勘違いでしたw



Humi

リンク

2013/9/14(Sat) 11:08:25|NO.57129

一応 dircopy を移動からコピーにしたら
全フォルダがコピーされました。
あとは消すだけ?


#uselib "shell32" #func global SHFileOperation "SHFileOperation" sptr #module #deffunc DirCopy str FromFolder,str ToFolder,int mode //DirCopy 引用元 http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200801/08050033.txt //mode=1 にするとFromFolder(フォルダ)をToFolder(フォルダ)に移動します sdim from, strlen(FromFolder)+2 poke from, 0, fromFolder wpoke from, strlen(fromFolder), 0 sdim to, strlen(toFolder)+2 poke to, 0, toFolder wpoke to, strlen(toFolder), 0 SHFILEOPSTRUCT = hwnd, mode, varptr(From), varptr(To), $150, -1, 0, 0 SHFileOperation varptr(SHFILEOPSTRUCT) return #global title "" screen 0,200,200 button goto "置換",*tikan button goto "起動",*kidou button goto "確認",*kakunin favorite = dirinfo($10006) f1 = favorite s1 = dir_exe + "\\処理用" k1 = dir_exe + "\\格納庫" s3 = dir_exe + "\\処理用\\バー" k3 = dir_exe + "\\格納庫\\バー" stop // step0 フォルダのチェック *tikan title "置換中" chdir dir_exe : dirlist x,s1,5 If stat = 0 : mkdir "処理用" chdir dir_exe : dirlist x,k1,5 If stat = 0 : mkdir "格納庫" // step1 お気に入り→処理用 title "置換中・" chdir f1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt f2 = favorite + "\\" +fname dircopy f2, s1, 2 //Linksの挙動がつかめないので、別で処理する wait 10 loop // step2 格納庫→お気に入り title "置換中・・" chdir k1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt k2 = dir_exe + "\\格納庫" + fname dircopy k2, f1, 2 wait 1 loop // step3 処理用→格納庫 title "置換中・・・" chdir s1 dirlist list,"*.*",5 notesel list repeat notemax noteget fname,cnt s2 = dir_exe + "\\処理用" + fname dircopy s2, k1, 2 wait 1 loop title "" stop *kidou exec "iexplore",16 stop *kakunin exec f1,,"explore" exec s1,,"explore" exec k1,,"explore" stop



fortunehill

リンク

2013/9/14(Sat) 12:00:36|NO.57133

/*ご参考
 .侫.ぅ訛粟とか権限とか考察考慮してみるとか
 ▲▲廛蹇璽訴僂┐謄譽献好肇蝓爾里気に入りの場所変更するとか
*/



黒目

リンク

2013/9/14(Sat) 13:56:24|NO.57135

アプローチを変えてみました。

//お気に入りパス変更テスト #include "hspext.as" sdim cpu,255,5 cpu.1 = "" cpu.2 = "" dirlist x,dir_exe + "\\設定",5 if stat = 0 : mkdir dir_exe + "\\設定" // レジストリキーを指定する(読み出しモード) regkey 0, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", 0 getreg cpu.1, "Favorites", 0 //%USERPROFILE% = C:\Users\(ユーザー名) cpu.2 = dir_exe + "\\設定" setreg cpu.2,"Favorites",1 button goto "戻す",*modori stop *modori setreg cpu.1,"Favorites",1 stop

フォルダ移動ができないことの解決にはなっていませんが、
当初の目的は達成できそうなので、解決ということにしておきます。



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