次の方法で共有


CopyFileExW 関数 (winbase.h)

既存のファイルを新しいファイルにコピーし、コールバック関数を介してその進行状況をアプリケーションに通知します。

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

構文

BOOL CopyFileExW(
  [in]           LPCWSTR            lpExistingFileName,
  [in]           LPCWSTR            lpNewFileName,
  [in, optional] LPPROGRESS_ROUTINE lpProgressRoutine,
  [in, optional] LPVOID             lpData,
  [in, optional] LPBOOL             pbCancel,
  [in]           DWORD              dwCopyFlags
);

パラメーター

[in] lpExistingFileName

既存のファイルの名前。

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

先端

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

lpExistingFileName 存在しない場合、CopyFileEx 関数は失敗し、GetLastError 関数は ERROR_FILE_NOT_FOUNDを返します。

[in] lpNewFileName

新しいファイルの名前。

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

先端

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

[in, optional] lpProgressRoutine

ファイルの別の部分がコピーされるたびに呼び出される LPPROGRESS_ROUTINE 型のコールバック関数のアドレス。 このパラメーターは NULLできます。 進行状況コールバック関数の詳細については、CopyProgressRoutine 関数を参照してください。

[in, optional] lpData

コールバック関数に渡される引数。 このパラメーターは NULLできます。

[in, optional] pbCancel

このフラグがコピー操作中に TRUE に設定されている場合、操作は取り消されます。 それ以外の場合、コピー操作は引き続き完了します。

[in] dwCopyFlags

ファイルのコピー方法を指定するフラグ。 このパラメーターには、次の値の組み合わせを指定できます。

価値 意味
COPY_FILE_ALLOW_DECRYPTED_DESTINATION
0x00000008
コピー先のコピーを暗号化できない場合でも、暗号化されたファイルをコピーしようとすると成功します。
COPY_FILE_COPY_SYMLINK
0x00000800
ソース・ファイルがシンボリック・リンクの場合、宛先ファイルは、ソース・シンボリック・リンクが指しているのと同じファイルを指すシンボリック・リンクでもあります。

Windows Server 2003 および Windows XP: この値はサポートされていません。

COPY_FILE_FAIL_IF_EXISTS
0x00000001
ターゲット ファイルが既に存在する場合、コピー操作はすぐに失敗します。
COPY_FILE_NO_BUFFERING
0x00001000
コピー操作は、バッファーなし I/O を使用して実行され、システム I/O キャッシュ リソースをバイパスします。 非常に大きなファイル転送に推奨されます。

Windows Server 2003 および Windows XP: この値はサポートされていません。

COPY_FILE_OPEN_SOURCE_FOR_WRITE
0x00000004
ファイルがコピーされ、元のファイルが書き込みアクセス用に開かれます。
COPY_FILE_RESTARTABLE
0x00000002
コピーが失敗した場合、コピーの進行状況はターゲット ファイルで追跡されます。 失敗したコピーは、後で lpExistingFileName に同じ値を指定し、失敗した呼び出しで使用されるものと同じ値を lpNewFileName することで再開できます。 これにより、コピー操作中に新しいファイルが複数回フラッシュされる可能性があるため、コピー操作の速度が大幅に低下する可能性があります。
COPY_FILE_REQUEST_COMPRESSED_TRAFFIC
0x10000000

コピー操作中に、基になる転送チャネルにデータの圧縮を要求します。 要求はすべてのメディアでサポートされていない場合があり、その場合は無視されます。 圧縮属性とパラメーター (計算の複雑さ、メモリ使用量) は、この API では構成できません。また、異なる OS リリース間で変更される可能性があります。

このフラグは、Windows 10 バージョン 1903 および Windows Server 2022 で導入されました。 Windows 10 では、SMB 共有に存在するファイルに対してフラグがサポートされます。この場合、ネゴシエートされた SMB プロトコルのバージョンは SMB v3.1.1 以降です。

戻り値

関数が成功した場合、戻り値は 0 以外です。

関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。

ユーザー 操作を取り消したために lpProgressRoutinePROGRESS_CANCEL を返した場合、CopyFileEx は 0 を返し、GetLastError ERROR_REQUEST_ABORTEDを返します。 この場合、部分的にコピーされたコピー先ファイルが削除されます。

ユーザー 操作を停止したために lpProgressRoutinePROGRESS_STOP を返す場合、CopyFileEx は 0 を返し、GetLastError ERROR_REQUEST_ABORTEDを返します。 この場合、部分的にコピーされたコピー先ファイルはそのまま残ります。

備考

この関数は、拡張属性、OLE 構造化ストレージ、NTFS ファイル システム代替データ ストリーム、セキュリティ リソース属性、およびファイル属性を保持します。

Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 既存のファイルの セキュリティ リソース属性 (ATTRIBUTE_SECURITY_INFORMATION) は、Windows 8 および Windows Server 2012 まで新しいファイルにコピーされません。

既存のファイルのセキュリティ リソース プロパティ (ATTRIBUTE_SECURITY_INFORMATION) が新しいファイルにコピーされます。

Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 既存のファイルの セキュリティ リソースプロパティは、Windows 8 および Windows Server 2012 まで新しいファイルにコピーされません。

この関数は、コピー先ファイルが既に存在し、FILE_ATTRIBUTE_HIDDEN または FILE_ATTRIBUTE_READONLY 属性が設定されている場合、ERROR_ACCESS_DENIED で失敗します。

CopyFileEx使用して暗号化されたファイルをコピーすると、関数はソース ファイルの暗号化に使用されるキーを使用して、コピー先ファイルの暗号化を試みます。 これができない場合、この関数は既定のキーを使用して宛先ファイルの暗号化を試みます。 これらのメソッドの両方を実行できない場合、CopyFileExERROR_ENCRYPTION_FAILED エラー コードで失敗します。 コピー先ファイルを暗号化できない場合でもコピー操作を完了 CopyFileExする場合は、copyFileExの呼び出しに dwCopyFlags パラメーターの値として COPY_FILE_ALLOW_DECRYPTED_DESTINATION 含めます。

COPY_FILE_COPY_SYMLINK を指定すると、次の規則が適用されます。

  • ソース・ファイルがシンボリック・リンクの場合は、ターゲット・ファイルではなくシンボリック・リンクがコピーされます。
  • ソース ファイルがシンボリック リンクでない場合、動作に変更はありません。
  • 宛先ファイルが既存のシンボリック・リンクの場合、ターゲット・ファイルではなくシンボリック・リンクが上書きされます。
  • COPY_FILE_FAIL_IF_EXISTS も指定され、宛先ファイルが既存のシンボリック リンクである場合、操作は失敗します。
COPY_FILE_COPY_SYMLINK が指定されていない場合は、次の規則が適用されます。
  • COPY_FILE_FAIL_IF_EXISTS も指定され、宛先ファイルが既存のシンボリック リンクである場合、シンボリック リンクのターゲットが存在する場合にのみ、操作は失敗します。
  • COPY_FILE_FAIL_IF_EXISTS が指定されていない場合、動作に変更はありません。

Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: LAN 経由でファイルコピー操作を最適化するアプリケーションを作成する場合は、Windows ソケット (Winsock) の TransmitFile 関数の使用を検討してください。 TransmitFile は、高パフォーマンスのネットワーク転送をサポートし、ファイルの内容をリモート コンピューターに送信するための簡単なインターフェイスを提供します。 TransmitFileを使用するには、ソース コンピューターからファイルを送信する Winsock クライアント アプリケーションと、他の Winsock 関数を使用してリモート コンピューター上のファイルを受信する Winsock サーバー アプリケーションを記述する必要があります。

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

テクノロジー サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
 

手記

winbase.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして CopyFileEx を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

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

関連項目

CopyFile

CopyFileTransacted

CopyProgressRoutine

CreateFile の

ファイル属性定数

ファイル管理機能の

MoveFile の

MoveFileWithProgress の

シンボリック リンク の

TransmitFile