MoveFileExA 関数 (winbase.h)

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

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

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

構文

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

パラメーター

[in] lpExistingFileName

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

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

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

先端

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

[in, optional] lpNewFileName

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

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

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

dwFlagsMOVEFILE_DELAY_UNTIL_REBOOT を指定し、lpNewFileName が NULL場合 、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 失敗します。 この関数は、再起動時に名前を変更するファイルの場所を次のレジストリ値に格納します。system HKEY_LOCAL_MACHINE\\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

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

  • szSrcFile\0\0
  • szSrcFile\0szDstFile\0
szSrcFile\0\0 文字列は、szSrcFile ファイルが再起動時に削除されることを示します。 szSrcFile\0szDstFile\0 文字列は、szSrcFile が再起動時に szDstFile 名前変更されることを示します。
注意REG_MULTI_SZ ノードでは技術的には許可されていませんが、ファイルの名前が null 名に変更されていると見なされるためです。
 
システムはこれらのレジストリ エントリを使用して、再起動時の操作を、発行されたのと同じ順序で完了します。 たとえば、次のコード フラグメントは、szSrcFile
削除するレジストリ エントリを作成し、再起動時 szSrcFile の名前を szDstFile に変更します。
MoveFileEx(szSrcFile, 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 透過的フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
 

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

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winbase.h (Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

CopyFile

DeleteFile の

ファイル管理機能の

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

GetWindowsDirectory の

MoveFileTransacted の

MoveFileWithProgress の

WritePrivateProfileString の