MoveFileEx
既存のファイルまたはディレクトリを移動します。
MoveFileWithProgress 関数は、MoveFileEx 関数に似ています。ただし、MoveFileWithProgress 関数を使うと、進捗状況の通知を受け取るコールバック関数を提供できます。
BOOL MoveFileEx( LPCTSTR lpExistingFileName, // 既存のファイル名 LPCTSTR lpNewFileName, // 新しいファイル名 DWORD dwFlags // 移動オプション );
パラメータ
- lpExistingFileName
- ローカルコンピュータ内の既存のファイル名またはディレクトリ名を保持している、NULL で終わる文字列へのポインタを指定します。
dwflags パラメータで MOVEFILE_DELAY_UNTIL_REBOOT を指定した場合、lpExistingFileName パラメータでは、読み取り専用の属性が割り当てられているファイルを指定できません。
Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加してください。詳細については、MSDN ライブラリの「」(ファイル名の規則)を参照してください。
- lpNewFileName
- lpExistingFileName パラメータで指定した、ローカルコンピュータ上のファイルまたはディレクトリに割り当てるべき新しい名前を保持している、NULL で終わる文字列へのポインタを指定します。
ファイルを移動する場合は、他のファイルシステムや他のドライブを指定してもかまいません。ただし、他のドライブを指定する場合、dwFlags パラメータで MOVEFILE_COPY_ALLOWED フラグを指定しなければなりません。
ディレクトリを移動する場合、他のドライブを指定できません。
dwFlags パラメータで MOVEFILE_DELAY_UNTIL_REBOOT フラグを指定した場合、lpNewFileName パラメータで NULL を指定できます。この場合、MoveFileEx 関数は、次にシステムを再起動する際に lpExistingFileName で指定したファイルを削除するよう登録を行います。lpExistingFileName パラメータでディレクトリを指定した場合、再起動時にそのディレクトリが空である場合に限って、システムはそのディレクトリを削除します。
- dwFlags
- 移動方法を指示するフラグを指定します。次の値のいずれかまたは任意の組み合わせを指定します。
値 意味 MOVEFILE_COPY_ALLOWED 他のボリュームへファイルを移動するよう指示された場合、この関数は、CopyFile 関数と DeleteFile 関数を使って、その動作をシミュレートします。 このフラグを、MOVEFILE_DELAY_UNTIL_REBOOT フラグと共に指定することはできません。
MOVEFILE_CREATE_HARDLINK 将来の使用に備えて予約されています。 MOVEFILE_DELAY_UNTIL_REBOOT この関数は、オペレーティングシステムを再起動するまでファイルを移動しません。システムは、AUTOCHK(Windows NT/2000 に付属していて、Chkdsk に相当し、起動時に実行できます)を実行した直後、かつページングファイルを作成する前にファイルを移動します。その後、この値が指定されている場合は、この関数は前回のスタートアップに使ったページングファイルを削除できます。 このフラグを指定できるのは、Administrators グループに所属するユーザーのコンテキスト、または LocalSystem アカウントのコンテキストだけです。
このフラグを、MOVEFILE_COPY_ALLOWED フラグと共に指定することはできません。
MOVEFILE_FAIL_IF_NOT_TRACKABLE Windows 2000:移動元ファイルがリンクソースの場合、このファイルは失敗します。そして、移動後は、そのファイルのリンクトラッキングを行えません。FAT ファイルシステムでフォーマットされたボリュームを移動先として指定すると、このような問題が発生することがあります。 MOVEFILE_REPLACE_EXISTING lpNewFileName パラメータで指定されたファイル名が既に存在していた場合、その内容を lpExistingFileName パラメータで指定されたファイルに置き換えます。 lpNewFileName と lpExistingFileName どちらかのパラメータでディレクトリを指定した場合は、この値を利用できません。
MOVEFILE_WRITE_THROUGH ファイルがディスク上で実際に移動するまで、制御を返しません。 このフラグを指定すると、コピーと削除の操作からなる移動操作をディスクへフラッシュした(実際に書き込んだ)後、この関数から制御が返ることが保証されます。コピー操作が終わった後、フラッシュが実施されます。
このフラグは、MOVEFILE_DELAY_UNTIL_REBOOT フラグが指定されていると機能しません。
戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。
解説
dwFlags パラメータで MOVEFILE_DELAY_UNTIL_REBOOT フラグを指定すると、MoveFileEx 関数は、再起動時に名前を変更するファイルの位置を、レジストリの次の値に格納します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
レジストリにアクセスできない場合、この関数は失敗します。
PendingFileRenameOperations 値のデータ型は、REG_MULTI_SZ です。1 つの名前変更操作につき、NULL で終わる文字列が 2 つ格納されます。システムはこれらのレジストリエントリを使って、発行されたのと同じ順序で、再起動時に操作を完了させます。たとえば、次のサンプルコードは、再起動時に szDstFile を削除し、szSrcFile を szDstFile へ名前変更する複数のレジストリエントリを作成します。
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);
システムは、PendingFileRenameOperations に次のエントリを格納します。
szDstFile\0\0
szSrcFile\0szDstFile\0\0
MOVEFILE_DELAY_UNTIL_REBOOT フラグを指定して移動と削除の操作を要求すると、実際の操作が発生するのは、呼び出し側のアプリケーションが終了した後です。そのため、ファイルの移動や削除が成功したか失敗したかを戻り値へ反映することは不可能です。代わりに、戻り値は、適切なエントリをレジストリに書き込むことに成功したかどうかを表します。
フラグを指定して、ディレクトリを削除するよう要求すると、再起動時にそのディレクトリが空であった場合に限って、システムはそのディレクトリを削除します。そのディレクトリを確実に削除するには、削除を試みる前に、そのディレクトリ内のすべてのファイルを移動または削除してください。再起動時にそのディレクトリ内にファイルが存在している可能性もありますが(一時ファイルなど)、そのディレクトリを削除するには、再びそれらのファイルを削除または移動しなければなりません。
移動と削除の操作は、呼び出し側のアプリケーションが発行したのと同じ順序で、再起動時に実行されます。起動時にファイルが存在しているディレクトリを削除するには、最初にそれらのファイルを削除しなければなりません。
Windows 2000:MoveFileEx 関数は、分散リンクトラッキング機能と協調して動作するので、ファイルやディレクトリを移動した場合も、引き続きリンクソースのトラッキングを行えます。
Windows 95/98:この関数はサポートされていません。Windows 95/98 で、再起動時にファイル名の変更またはファイルの削除を実現するには、次の方法を使ってください。
Windows 95/98 でファイルの名前変更または削除を行う方法
1.Windows ディレクトリに WININIT.INI ファイルが存在するかどうか調べます。
2.WININIT.INI ファイルが存在する場合、そのファイルを開き、既存の [rename] セクションに新しいエントリを追加します。存在していない場合、そのファイルを作成し、[rename] セクションを作成します。
3.[rename] セクションに、次の形式でエントリを追加します。
DestinationFileName=SourceFileName
DestinationFileName と SourceFileName は、どちらも短いファイル名でなければなりません。ファイルを削除するには、DestinationFileName の値として NUL を指定してください。
システムは、起動時に、WININIT.INI を処理します。そして、WININIT.INI の処理が終わると、ファイル名を WININIT.BAK へ変更します。
ファイル名の削除または名前変更を行うには、そのファイルに対する「削除」のアクセス許可、または親ディレクトリに対する「子の削除」のアクセス許可を備えていなければなりません。「削除」と「子の削除」以外のすべてのアクセス許可を割り当て、新しいファイルの ACL(アクセス制御リスト)を継承するようディレクトリを設定した場合、ファイルを削除する権限なしでファイルを作成できる能力を取得できます。そして実際にファイルを作成すると、そのファイルのハンドルが返りますが、ファイルを作成する際に要求したすべてのアクセス権が、そのハンドルに割り当てられています。ファイルの作成時に「削除」のアクセス許可を要求した場合、そのハンドルに関係するファイルに限って、ファイルの削除または名前変更を行えます。ただし、他のファイルの削除や名前変更は行えません。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:対応していません
ヘッダー:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装