MoveFileExA 関数 (winbase.h)

さまざまな移動オプションを使って既存のファイルまたはディレクトリ (その子を含む) を移動します。

MoveFileWithProgress 関数は MoveFileEx 関数と同じですが、MoveFileWithProgress では進行状況通知を受け取るコールバック関数を提供できます。

この操作をトランザクション操作として実行するには、 MoveFileTransacted 関数を使用します。

構文

BOOL MoveFileExA(
  [in]           LPCSTR lpExistingFileName,
  [in, optional] LPCSTR lpNewFileName,
  [in]           DWORD  dwFlags
);

パラメーター

[in] lpExistingFileName

ローカル コンピューター上のファイルまたはディレクトリの現在の名前。

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOTが指定されている場合、遅延操作はネットワークが使用可能になる前に実行されるため、リモート共有にファイルを存在できません。

既定では、名前はMAX_PATH文字に制限されています。 この制限を 32,767 文字のワイド文字に拡張するには、パスの先頭に "\\?\" を付加します。 詳細については、「ファイル、パス、および名前空間の名前付け」を参照してください。

ヒント

Windows 10 バージョン 1607 以降では、"\\?\" を前に置かずに、MAX_PATHの制限を削除するようにオプトインできます。 詳細については、「 ファイル、パス、および名前空間の名前付け 」の「最大パス長の制限」セクションを参照してください。

[in, optional] lpNewFileName

ローカル コンピューター上のファイルまたはディレクトリの新しい名前。

ファイルを移動する場合、コピー先は別のファイル システムまたはボリュームに配置できます。 宛先が別のドライブにある場合は、dwFlagsMOVEFILE_COPY_ALLOWED フラグを設定する必要があります。

ディレクトリを移動する場合、移動先は同じドライブ上にある必要があります。

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOTを指定し、lpNewFileNameNULL の場合、MoveFileEx はシステムの再起動時に削除する lpExistingFileName ファイルを登録します。 lpExistingFileName がディレクトリを参照している場合、システムは、ディレクトリが空の場合にのみ、再起動時にディレクトリを削除します。

既定では、名前はMAX_PATH文字に制限されています。 この制限を 32,767 文字のワイド文字に拡張するには、パスの先頭に "\\?\" を付加します。 詳細については、「ファイル、パス、および名前空間の名前付け」を参照してください。

ヒント

Windows 10 バージョン 1607 以降では、"\\?\" を前に置かずに、MAX_PATHの制限を削除するようにオプトインできます。 詳細については、「 ファイル、パス、および名前空間の名前付け 」の「最大パス長の制限」セクションを参照してください。

[in] dwFlags

このパラメーターには、次の 1 つ以上の値を指定できます。

意味
MOVEFILE_COPY_ALLOWED
2 (0x2)
ファイルを別のボリュームに移動する場合、関数は CopyFile 関数と DeleteFile 関数を使用して移動をシミュレートします。

ファイルが正常に別のボリュームにコピーされ、元のファイルを削除できない場合、関数はソース ファイルをそのまま残して成功します。

この値は 、MOVEFILE_DELAY_UNTIL_REBOOTでは使用できません。

MOVEFILE_CREATE_HARDLINK
16 (0x10)
将来利用するために予約されています。
MOVEFILE_DELAY_UNTIL_REBOOT
4 (0x4)
オペレーティング システムが再起動されるまで、システムはファイルを移動しません。 システムは、AUTOCHK が実行された直後に、ページング ファイルを作成する前にファイルを移動します。 したがって、このパラメーターを使用すると、関数は以前のスタートアップからページング ファイルを削除できます。

この値は、プロセスが管理者グループまたは LocalSystem アカウントに属するユーザーのコンテキストにある場合にのみ使用できます。

この値は 、MOVEFILE_COPY_ALLOWEDでは使用できません。

MOVEFILE_FAIL_IF_NOT_TRACKABLE
32 (0x20)
ソース ファイルがリンク ソースである場合、関数は失敗しますが、移動後にファイルを追跡することはできません。 この状況は、宛先が FAT ファイル システムでフォーマットされたボリュームである場合に発生する可能性があります。
MOVEFILE_REPLACE_EXISTING
1 (0x1)
lpNewFileName という名前のファイルが存在する場合、アクセス制御リスト (ACL) に関するセキュリティ要件が満たされていれば、関数はその内容を lpExistingFileName ファイルの内容に置き換えます。 詳細については、このトピックの「解説」セクションを参照してください。

lpNewFileName が既存のディレクトリに名前を付ける場合は、エラーが報告されます。

MOVEFILE_WRITE_THROUGH
8 (0x8)
関数は、ファイルが実際にディスク上に移動されるまで戻りません。

この値を設定すると、コピー操作と削除操作として実行された移動が、関数が戻る前にディスクにフラッシュされます。 フラッシュは、コピー操作の最後に行われます。

MOVEFILE_DELAY_UNTIL_REBOOTが設定されている場合、この値は無効です。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

dwFlags パラメーターで MOVEFILE_DELAY_UNTIL_REBOOTが指定されている場合、レジストリにアクセスできない場合、MoveFileEx は失敗します。 この関数は、再起動時に名前を変更するファイルの場所を、次のレジストリ値に格納します。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

このレジストリ値は 、REG_MULTI_SZ型です。 各名前変更操作には、名前の変更が削除であるかどうかに応じて、次の NULL で終わる文字列のいずれかが格納されます。

  • szDstFile\0\0
  • szSrcFile\0szDstFile\0
文字列 szDstFile\0\0 は、再起動時に ファイル szDstFile が削除されることを示します。 文字列 szSrcFile\0szDstFile\0 は、再起動時に szSrcFile の名前を szDstFile に変更することを示します。
メモ \0\0 は技術的には REG_MULTI_SZ ノードでは許可されていませんが、ファイルの名前が null 名に変更されていると見なされるため、可能です。
 
システムは、これらのレジストリ エントリを使用して、再起動時の操作を、発行されたのと同じ順序で完了します。 たとえば、次のコード フラグメントは、 szDstFile を削除し、再起動時に szSrcFile の名前を szDstFile に変更するレジストリ エントリを作成します。
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

MOVEFILE_DELAY_UNTIL_REBOOT フラグで指定された実際の移動操作と削除操作は、呼び出し元のアプリケーションの実行が停止した後に行われるため、戻り値にはファイルの移動または削除の成功または失敗を反映できません。 代わりに、適切なエントリをレジストリに配置する場合の成功または失敗が反映されます。

システムは、 MOVEFILE_DELAY_UNTIL_REBOOT フラグが空の場合にのみ、削除用にタグ付けされたディレクトリを削除します。 ディレクトリを確実に削除するには、削除を試みる前に、ディレクトリからすべてのファイルを移動または削除します。 ファイルは起動時にディレクトリ内に存在する可能性がありますが、システムがディレクトリを削除する前に、ファイルを削除または移動する必要があります。

移動操作と削除操作は、呼び出し元のアプリケーションで指定された順序と同じ順序で、起動時に実行されます。 起動時にファイルが含まれるディレクトリを削除するには、まずファイルを削除します。

ファイルがボリューム間で移動された場合、 MoveFileEx はファイルを含むセキュリティ記述子を移動しません。 ファイルには、宛先ディレクトリに既定のセキュリティ記述子が割り当てられます。

MoveFileEx 関数は、リンク追跡サービスと操作を調整するため、リンク ソースは移動時に追跡できます。

ファイルを削除または名前変更するには、ファイルに対する削除アクセス許可を持っているか、親ディレクトリの子アクセス許可を削除する必要があります。 削除と削除の子を除くすべてのアクセス権を持つディレクトリを設定し、新しいファイルの ACL が継承されている場合は、削除できないファイルを作成できます。 ただし、ファイルを作成し、ファイルの作成時に返されたハンドルに対して要求したすべてのアクセス権を取得できます。 ファイルの作成時に削除アクセス許可を要求した場合は、そのハンドルを使用してファイルを削除または名前変更できますが、他のハンドルでは削除できません。 詳細については、「 ファイル のセキュリティとアクセス権」を参照してください。

Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。

テクノロジ サポートされています
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 Transparent Failover (TFO) はい
スケールアウト ファイル共有 (SO) を使う SMB 3.0 はい
クラスターの共有ボリューム ファイル システム (CsvFS) はい
Resilient File System (ReFS) はい
 

例については、「 一時ファイルの作成と使用」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winbase.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CopyFile

DeleteFile

File Management 関数

ファイルのセキュリティとアクセス権

GetWindowsDirectory

MoveFileTransacted

MoveFileWithProgress

WritePrivateProfileString