SHFILEOPSTRUCT

SHFileOperation 関数が行なうファイル操作に関しての情報が格納されます。

typedef struct _SHFILEOPSTRUCT {
    HWND  hwnd;                 // ウィンドウハンドル
    UINT  wFunc;                // 実行する操作
    LPCTSTR  pFrom;             // 対象ファイル名
    LPCTSTR  pTo;               // 目的ファイル名
    FILEOP_FLAGS  fFlags;       // フラグ
    BOOL fAnyOperationsAborted; // 結果
    LPVOID  hNameMappings;      // ファイル名マッピングオブジェクト
    LPCTSTR lpszProgressTitle;  // ダイアログのタイトル
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

メンバ

hwnd

ファイル操作の状況を表示するダイアログボックスのオーナーウィンドウのハンドルを指定します。

wFunc

実行するファイル操作を示す値を指定します。以下の値のいずれかが格納されます。

意味
0x0001 (FO_MOVE)

pFrom メンバで指定されたファイルを pTo メンバで指定された位置に移動します。

0x0002 (FO_COPY)

pFrom メンバで指定されたファイルを pTo メンバで指定された位置にコピーします。

0x0003 (FO_DELETE)

pFrom メンバで指定されたファイルを削除します。

0x0004 (FO_RENAME)

pFrom メンバで指定されたファイルの名前を pTo メンバで指定されたファイル名に変更します。このフラグを使用して、一度の関数呼び出しで複数のファイルの名前を変更することはできません。複数のファイルの名前を変更するには FO_MOVE フラグを使用します。

pFrom

操作の対象となる1つ以上のファイル名が格納されたバッファのアドレスを指定します。これらのファイル名はフルパス指定されていなければなりません。ファイル名に “*” などの、標準MS-DOSワイルドカードを指定することができます。

それぞれのファイル名は1つのヌル文字で区切られていなければなりません。また、最後のファイル名の後ろには2つのヌル文字を入れていなければなりません。

pTo

コピー・移動先ディレクトリ名または変更後のファイル名が格納されたバッファのアドレスを指定します。このメンバを使用しない場合には 0 (NULL) を指定しなければなりません。

コピーまたは移動の操作において、 pFrom メンバと同様の方法で複数のファイルを指定することができます。この場合、それぞれのファイル名は1つのヌル文字で区切り、最後のファイル名の後ろには2つのヌル文字を入れていなければなりません。複数のファイル名を指定するには、 fFlags メンバに FOF_MULTIDESTFILES フラグを指定します。

コピーまたは移動の操作において、存在しないディレクトリを指定することができます。このとき、システムはディレクトリの作成を試みますが、通常は、ダイアログボックスを表示して新しいディレクトリを作成するかどうかをユーザーに確認します。ファイル操作中にダイアログボックスを表示しないようにするには、 fFlags メンバに FOF_NOCONFIRMMKDIR フラグを指定します。

ファイル名にワイルドカード文字を使用することはできません。また、ファイル名はフルパス指定されていなければなりません。相対パスを使用すると、予期しない結果を引き起こす可能性があります。

fFlags

ファイル操作を制御するオプションフラグを指定します。 0 または以下の値を組み合わせて指定します。

意味
0x0001 (FOF_MULTIDESTFILES)

pTo メンバが複数のファイル名を指定していることを示します。

0x0002 (FOF_CONFIRMMOUSE)

現在は使用されません。

0x0004 (FOF_SILENT)

経過を表すダイアログボックスを表示しません。

0x0008 (FOF_RENAMEONCOLLISION)

移動、コピー、名前の変更の操作において、指定したファイル名がすでに存在していた場合には、操作対象のファイルに新しい名前を付けます。

0x0010 (FOF_NOCONFIRMATION)

表示されるダイアログボックスで『はい』または『すべて』を選択するようにします。

0x0020 (FOF_WANTMAPPINGHANDLE)

FOF_RENAMEONCOLLISION が指定されていて、同じファイル名が存在したために新しいファイル名がつけられた場合に、古い名前と新しい名前を含むマッピングオブジェクトのハンドルを hNameMappings メンバに格納します。

0x0040 (FOF_ALLOWUNDO)

できる限りアンドゥ情報を保持するようにします。 pFrom で指定されたファイル名がフルパスで指定されている必要があります。削除時に指定すると、ファイルがごみ箱へ入れられます。

0x0080 (FOF_FILESONLY)

ワイルドカードファイル名(*.*)が指定された場合にのみ操作を実行します。

0x0100 (FOF_SIMPLEPROGRESS)

経過を表すダイアログボックスにファイル名を表示しません。

0x0200 (FOF_NOCONFIRMMKDIR)

新しいディレクトリを作成する必要がある場合に、作成するかどうかの確認をしません。

0x0400 (FOF_NOERRORUI)

エラーが発生した場合に、ユーザーインターフェースを表示しません。

0x0800 (FOF_NOCOPYSECURITYATTRIBS)

Version 4.71 以降: ファイルのセキュリティ属性がコピーされないようにします。

0x1000 (FOF_NORECURSION)

ローカルディレクトリのみに操作を行ないます。サブディレクトリに対して再帰的に操作を行ないません。

0x2000 (FOF_NO_CONNECTED_ELEMENTS)

Windows Me/2000 以降: グループとして接続されているファイルを移動しません。指定されたファイルのみを移動します。

0x4000 (FOF_WANTNUKEWARNING)

Windows Me/2000 以降: ごみ箱に入れるのではない削除操作の際にファイルが削除されるときに警告をします。

0x8000 (FOF_NORECURSEREPARSE)

Windows XP 以降: リパースポイントをコンテナではなくオブジェクトとして扱います。

fAnyOperationsAborted

指定したファイル操作が完了する前にユーザーによって中止された場合には 1 (TRUE) が格納されます。それ以外の場合には 0 (FALSE) が格納されます。

hNameMappings

移動・コピー・名前変更されたファイルの古いファイル名と新しいファイル名を含むファイル名マッピングオブジェクトのハンドルが格納されます。このメンバは fFlags メンバに FOF_WANTMAPPINGHANDLE フラグが指定された場合にのみ使用されます。このハンドルが不要になったら SHFreeNameMappings 関数で解放しなくてはなりません。このハンドルに関しては、下の解説を参照してください。

lpszProgressTitle

経過を表示するダイアログボックスのタイトルバーに使用する文字列のアドレスを指定します。 fFlags メンバで FOF_SIMPLEPROGRESS が指定されている場合にのみ有効です。

解説

pFrom メンバおよび pFrom メンバがフルパスでないファイル名の場合は、カレントディレクトリにあるとみなされます。

ファイル削除時に pFrom メンバにフルパスでないファイル名が指定された場合は、 FOF_ALLOWUNDO フラグを指定した場合でもファイルはごみ箱に入れられません。

fFlags メンバに FOF_WANTMAPPINGHANDLE フラグを指定すると、 hNameMappings メンバにはファイル名マッピングオブジェクトのハンドルが格納されます。このハンドルは、メンバが UINT 型および SHNAMEMAPPING 構造体の配列へのポインタであるような構造体のポインタとして取り扱われます。すなわち、

struct HANDLETOMAPPINGS {
    UINT           uNumberOfMappings;  // 配列の要素数
    SHNAMEMAPPING *lpSHNameMapping;    // 配列へのポインタ
};

という構造体へのポインタであるとします(この HANDLETOMAPPINGS 構造体は明示的に定義されてはいません)。このときの UINT 型の値として、 SHNAMEMAPPING 構造体の配列の要素数がセットされます。各々の SHNAMEMAPPING 構造体には、変更された1つのファイルの古いパス名および新しいパス名が格納されています。

hNameMappings メンバの値として取得したハンドルは SHFreeNameMappings 関数を使用して解放しなければいけません。

hNameMappings メンバに返されるファイル名マッピングオブジェクトを参照する場合、 Windows 95/98/Me では、 SHFileOperation 関数は ANSI セットの SHNAMEMAPPING 構造体を返しますが、Windows NT/2000/XP では、 SHFileOperation 関数は ANSI 版の関数および Unicode 版の関数ともに Unicode セットの SHNAMEMAPPING 構造体を返します。したがって、すべてのバージョンの Windows で操作させるためには、 Windows のバージョンを調べて条件分けするコードを作成する必要があります。

対応情報

Shell32.dll Version 4.00 以降

Windows 95 以降 / Windows NT 4.0 以降

変数との対応

HSP 変数 メンバ
メンバ名 オフセット サイズ
shfo.0 hwnd 0 4
shfo.1 wFunc 4 4
shfo.2 pFrom 8 4
shfo.3 pTo 12 4
shfo.4 fFlags 16 4
shfo.5 fAnyOperationsAborted 20 4
shfo.6 hNameMappings 24 4
shfo.7 lpszProgressTitle 28 4