夕暮ログ

C#やJavascript、最近はAndroidなんかも好きなtinqのブログ。「夕暮れログ」

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ファイルオペレーションダイアログ

ダイアログシリーズ、これでひとまず終了予定です。 エクスプローラーなどと同じようにファイルをダイアログを表示して移動、消去、コピーできます。 進行状況がわかるので、大量のファイル操作時などに使ってみるといいかもしれません。

宣言

//構造体
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEOPSTRUCT
{
 public IntPtr hwnd;
 public FOFunc wFunc;
 MarshalAs(UnmanagedType.LPWStr)]
 public string pFrom;
 MarshalAs(UnmanagedType.LPWStr)]
 public string pTo;
 public FOFlags fFlags;
 public bool fAnyOperationsAborted;
 public IntPtr hNameMappings;
 MarshalAs(UnmanagedType.LPWStr)]
 public string lpszProgressTitle;
}
//API
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
public static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);

引数

SHFileOperationの引数には、SHIFILEOPSTRUCTをrefをつけて渡します。
SHIFILEOPSTRUCT内のフィールドは以下です。
IntPtr : hwnd
親のウィンドウハンドル
FOFunc : wFunc
動作を表すFOFunc列挙体 FO_MOVE 0x01 移動 FO_COPY 0x02 コピー FO_DELETE 0x03 消去 FO_RENAME 0x04 リネーム
string : pFrom
処理を行うファイル。ヌル文字(\0)で区切り、最後には\0\0をつける。
*と?のワイルドカードが利用できます。
c:\test1.txt\0c:\test2.txt\0c:\test3\0\0
pFromがフルパスでない場合は、カレントパスにあるとみなされる。また、FOF_ALLOWUNDOを指定してもゴミ箱へ送れなくなる。
string : pTo
移動、コピー、リネームの際にその先を指定する。
移動、コピーではディレクトリを指定する。またはpFromに対応するファイル名を同じようにヌル文字で区切って指定する。この場合、FOF_MULTIDESTFILESを指定する必要がある。
存在しないディレクトリを指定すると作成するか確認が出る。ワイルドカードは利用できず、フルパスで指定する必要がある。
FOFlags fFlags
フラグを指定します。 /
FOF_MULTIDESTFILES0x0001複数のファイルを処理します
FOF_CONFIRMMOUSE0x0002使われません
FOF_SILENT0x0004経過をあらわすダイアログを表示しません
FOF_RENAMEONCOLLISION0x0008ファイルがすでに存在していた場合、新しい名前をつける
FOF_NOCONFIRMATION0x0010確認のダイアログを表示せず、自動で「はい」または「すべて」になります
FOF_WANTMAPPINGHANDLE0x0020OF_RENAMEONCOLLISIONが指定され、リネームされたとき、古い名前と新しい名前を含むマッピングオブジェクトのハンドルをhNameMappingsメンバに格納します。この場合、hNameMappingsのマッピングオブジェクトをSHFreeNameMappings関数を使って開放する必要があります。
FOF_ALLOWUNDO0x0040操作を元に戻す(アンドゥ)できるようにします。また、消去時に指定されているとゴミ箱に移動します。pFromがフルパスで入っている必要があります。
FOF_FILESONLY0x0080ワイルドカード(*.*)が指定されたときだけ実行する(ファイルのみを対象?)
FOF_SIMPLEPROGRESS0x0100経過を表すダイアログに名前を表示しない
FOF_NOCONFIRMMKDIR0x0200新しいディレクトリを作成する必要があるときに確認を行わないで作成
FOF_NOERRORUI0x0400エラー発生時にそれを画面に表示しない
FOF_NOCOPYSECURITYATTRIBS0x0800ファイルのセキュリティ属性をコピーしない
FOF_NORECURSION0x1000ローカルディレクトリのみ操作を行う。サブディレクトリ内は操作しない
FOF_NO_CONNECTED_ELEMENTS0x2000グループになっているファイルを移動せず、指定したファイルのみを移動する。たとえば、フォルダ名が「ファイル名.files」などとなっている場合です。
FOF_WANTNUKEWARNING0x4000ゴミ箱に入れない消去が行われるとき、警告しますFOF_NOCONFIRMATIONが指定されていても表示されます。
FOF_NORECURSEREPARS0x800リパースポイントをコンテナではなくオブジェクトとして扱います。
bool : fAnyOperationsAborted
操作が完了する前にユーザーが中止するとtrue、それ以外はfalse
IntPtr : hNameMappings
FOF_WANTMAPPINGHANDLEの指定時、リネームが発生するとここにマッピングオブジェクトのハンドルが格納される。ハンドルが不要になったら SHFreeNameMappingsで開放する必要がある。
詳細はサイトを参照。
string : lpszProgressTitle
FOF_SIMPLEPROGRESSが指定されている場合に、ダイアログのタイトルを指定する

参考サイト一覧

この関数は非公開関数ではないのでけっこう情報があります。そのくせ、MSDNは英語だけだったりします。 列挙体を使いたい方や、実際にクラスにしたものはこちらですが、なんとなく非推奨です。 そもそもファイル操作メインなのにCommonDialogにまとまっていること自体がおかしいので、そのうち修正します。 ファイルをダイアログを出して移動、消去、コピーする
関連記事

コメント

ここをクリックしてコメントを投稿

非公開コメント

トラックバック

http://tinqwill.blog59.fc2.com/tb.php/7-f6a3d216

« next  ホーム  prev »

プロフィール

tinq tinq(もしくはTinqWill)

Sky  For   Every 改装予定

プログラミングお勉強中の高校生。月一くらいは更新したい

最新記事

カテゴリ

月別アーカイブ

検索フォーム

最新コメント

リンク

最新トラックバック

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。