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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0325
sinフォルダのコピー3解決


sin

リンク

2020/3/25(Wed) 08:59:01|NO.89823

フォルダのコピーをしたいです。
調べてみたのですが、自分の環境が悪いのかうまく出来ません。

#uselib "kernel32.dll"
#func MoveFile "MoveFileA" sptr,sptr
file1 = "X:\\a"
file2 = "X:\\b"
MoveFile file1, file2

こういうのを見付けました。
これはうまくいきました。
MoveではなくCopyにすれば良いのかと思いやってみましたが、何も起こりませんでした。
何が悪いのでしょうか?



この記事に返信する


あらや

リンク

2020/3/25(Wed) 12:11:35|NO.89827

MoveFileはファイル・フォルダのどちらにも対応していますが、
CopyFileはファイルだけにしか対応していません。

フォルダのコピーは、フォルダは自力で作成し
中のファイルはCopyFileで全てコピーするという面倒な方法と
『SHFileOperation』を使う方法があります。

SHFileOperationを使った例:

#uselib "shell32.dll" #func SHFileOperation "SHFileOperationA" var #uselib "user32.dll" #cfunc GetDesktopWindow "GetDesktopWindow" // 操作の定数 #define FO_MOVE 0x0001 // 移動 #define FO_COPY 0x0002 // コピー #define FO_DELETE 0x0003 // 削除 #define FO_RENAME 0x0004 // 名前の変更 // 操作オプション定数 #define FOF_MULTIDESTFILES 0x0001 // 操作後のファイル名に複数のファイルを指定している #define FOF_CONFIRMMOUSE 0x0002 // (廃止された) #define FOF_SILENT 0x0004 // 進行状況を表示するダイアログを表示しない #define FOF_RENAMEONCOLLISION 0x0008 // 移動、コピー、名前の変更で名前が既存だった場合は新しい名前を付ける #define FOF_NOCONFIRMATION 0x0010 // ダイアログで『はい』または『すべて』を選択する #define FOF_WANTMAPPINGHANDLE 0x0020 // FOF_RENAMEONCOLLISIONのオプションがある場合、旧名と新名を記録する #define FOF_ALLOWUNDO 0x0040 // 『元に戻す』情報を保持する #define FOF_FILESONLY 0x0080 // ワイルドカードファイル(*.*)が指定された場合のみ操作実行 #define FOF_SIMPLEPROGRESS 0x0100 // 進行状況を表示するダイアログにファイル名を表示しない #define FOF_NOCONFIRMMKDIR 0x0200 // 新しいディレクトリを作成するときに確認しない #define FOF_NOERRORUI 0x0400 // エラー時にユーザーインターフェイスを表示しない #define FOF_NOCOPYSECURITYATTRIBS 0x0800 // ファイルのセキュリティ属性をコピーしない #define FOF_NORECURSION 0x1000 // ローカルディレクトリのみに操作し、サブディレクトリには操作をしない #define FOF_NO_CONNECTED_ELEMENTS 0x2000 // グループとして接続されているファイルを移動しない #define FOF_WANTNUKEWARNING 0x4000 // ごみ箱に入れるのではない削除操作のときに警告をする #define FOF_NORECURSEREPARSE 0x8000 // リパースポイントをコンテナではなくオブジェクトとして扱う sdim pFrom, 260; sdim pTo, 260; pFrom = "C:\\TEST"; // コピー元のフルパス pTo = "C:\\TEST_COPY"; // コピー先のフルパス dim SHFILEOPSTRUCT, 8; // SHFILEOPSTRUCT構造体 SHFILEOPSTRUCT(0) = GetDesktopWindow(); // 進行状況を表示するダイアログのオーナーウィンドウハンドル SHFILEOPSTRUCT(1) = FO_COPY; // ファイル(もしくはディレクトリ)のコピー SHFILEOPSTRUCT(2) = varptr(pFrom); // 操作元(コピー元)のパスの文字列へのポインタ SHFILEOPSTRUCT(3) = varptr(pTo); // 操作後(コピー後)のパスの文字列へのポインタ SHFILEOPSTRUCT(4) = FOF_RENAMEONCOLLISION | FOF_NOCONFIRMATION; // 操作オプション SHFILEOPSTRUCT(5) = fAnyOperationsAborted; // 操作がユーザーによって中止された場合は1、その他は0が入る SHFILEOPSTRUCT(6) = 0; // オプションにFOF_WANTMAPPINGHANDLEを使っている場合、ここで指定した変数に記録される SHFILEOPSTRUCT(7) = 0; // オプションにFOF_SIMPLEPROGRESSを使っている場合、ダイアログのタイトルバーの文字列になる SHFileOperation SHFILEOPSTRUCT; // コピー実行 if( stat == 0 ) { mes "コピー操作に成功しました"; } else { mes "コピー操作に失敗しました"; }

定数が多くて長く見えますが、不要な定数は消して使ってください。



とあるプログラマ

リンク

2020/3/25(Wed) 13:53:08|NO.89828

Win32APIではなくhspextのpipeexecとxcopyを組み合わせたものですが一応こういう方法もあります。


#include "hspext.as" // コピー元 sdim srcDir, 256 selfolder srcDir, "コピー元を選択してください。" if (stat == 1) : end // コピー先 sdim destDir, 256 selfolder destDir, "コピー先を選択してください。" if (stat == 1) : end destDir += "\\" + getpath(srcDir, 8) // コピー先+コピー元のフォルダ としておく(getpathが荒業だけど) dialog "コピーが実行されます。\n(同名のファイルがある場合は上書きされます。)\n\n" + srcDir + "\n-> " + destDir + "", 3 if (stat != 6) : end // pipeexecでxcopy実行 sdim buf, 32000 pipeexec buf, "xcopy \"" + srcDir + "\" \"" + destDir + "\" /E /C /I /Y", 0 title "コピー実行中…" sdim ln, 4096 repeat pipeget ln if (stat == 0) : break wait 10 loop title "コピー終了" mes ln stop



sin

リンク

2020/3/25(Wed) 14:19:38|NO.89829

2つのサンプル確認してみました。
両方共に成功しました。
ファイルのコピーが出来たからフォルダも簡単だろうと気楽に思っていましたがこんなに苦労するとは・・・。
ありがとうございました。



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