> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# WdRemoteCopy

> WdRemoteCopy

# WdRemoteCopy

Copia archivos entre un PC local y un dispositivo remoto.

## Sintaxis

```cpp theme={null}
HRESULT WdRemoteCopy(  
         _In_z_ const char* remoteDevice,  
         _In_z_ const char* sourcePath,  
         _In_z_ const char* destinationPath,  
         _In_opt_ const WdCopyOptions* copyOptions,  
         _In_opt_ const WdCopySearchOptions* searchOptions,  
         _In_opt_ const WdCopyStatusCallbacks* statusCallbacks,  
         _In_opt_ WdCancellationHandle cancellationHandle  
);  
```

### Parámetros

`_In_z_ remoteDevice`\
Tipo: **const char\***

Nombre de host o dirección IP del dispositivo remoto (por ejemplo, `"192.168.1.100"` o `"MyDevKit"`).

`_In_z_ sourcePath`\
Tipo: **const char\***

Ruta de acceso de origen desde la que se copia (por ejemplo, `"C:\\builds\\MyGame"` al copiar a un dispositivo remoto).

`_In_z_ destinationPath`\
Tipo: **const char\***

Ruta de acceso de destino en la que se copia. Puede ser una ruta de acceso absoluta (por ejemplo, `"D:\\Games\\MyGame"`) o una ruta de acceso relativa que se resuelve con respecto a la raíz común (por ejemplo, `"MyGame"`).

`_In_opt_ copyOptions`\
Tipo: **const [WdCopyOptions](/reference/remoting/structs/wdcopyoptions)\***

Opcional. Especifica la dirección de la copia y el alias de la raíz común. Pase `nullptr` para usar la configuración predeterminada (`CopyTo`, ubicación de raíz común predeterminada si `destinationPath` es una ruta de acceso relativa).

`_In_opt_ searchOptions`\
Tipo: **const [WdCopySearchOptions](/reference/remoting/structs/wdcopysearchoptions)\***

Opcional. Especifica los patrones de inclusión/exclusión de archivos y los filtros de atributos (por ejemplo, `"*.exe;*.dll"` para copiar solo los ejecutables). Pase `nullptr` para copiar todos los archivos.

`_In_opt_ statusCallbacks`\
Tipo: **const [WdCopyStatusCallbacks](/reference/remoting/structs/wdcopystatuscallbacks)\***

Opcional. Especifica las funciones de devolución de llamada para recibir actualizaciones de progreso y mensajes de diagnóstico durante la operación de copia. Pase `nullptr` para no recibir devoluciones de llamada.

`_In_opt_ cancellationHandle`\
Tipo: **[WdCancellationHandle](/reference/remoting/structs/wdcancellationhandle)**

Opcional. Identificador de cancelación creado por [WdCreateCancellationHandle](/reference/remoting/functions/wdcreatecancellationhandle) que se puede pasar a [WdCancelRemoteCopy](/reference/remoting/functions/wdcancelremotecopy) desde un subproceso independiente para cancelar la operación de copia. Pase `nullptr` si no se necesita la cancelación.

### Valor devuelto

Tipo: **HRESULT**

Devuelve `S_OK` si se realiza correctamente; de lo contrario, devuelve un código de error.

#### Códigos de error

| Código                  | Valor      | Descripción                                                     | Causa raíz                                                                                                                                                                           | Solución de problemas                                                                                                                                                                                                                                |
| ----------------------- | ---------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| E\_CONNECTIONERROR      | 0x8C114014 | Error de conexión.                                              | Error genérico al establecer la conexión de red (error a nivel de transporte), no relacionado con la validez de la dirección IP ni con la resolución del nombre de la máquina remota | Compruebe la conectividad de red, las reglas de firewall y la disponibilidad del servicio en la máquina remota; compruebe la visibilidad entre dispositivos: deberían poder hacerse ping entre sí; reintente la conexión con el registro habilitado. |
| E\_NAMERESOLUTIONFAILED | 0x8C114012 | No se pudo resolver el nombre de la máquina remota.             | El nombre de host no se puede resolver mediante DNS ni mediante resolución de nombres local.                                                                                         | Compruebe la ortografía del nombre de host, la configuración de DNS y la conectividad de red; use la dirección IP para aislar los problemas de resolución de nombres.                                                                                |
| E\_INVALIDADDRESS       | 0x8C114013 | Dirección no válida.                                            | Se proporcionó una dirección de red incorrecta, con formato erróneo o no compatible (por ejemplo, un formato de IP incorrecto, una IP errónea o un protocolo no compatible).         | Confirme la dirección IP correcta; corrija el formato de la dirección y asegúrese de que use un protocolo IPv4                                                                                                                                       |
| E\_CLIENTNOTAUTHORIZED  | 0x8C114008 | El dispositivo rechazó al cliente.                              | El cliente no está en la lista de clientes de confianza del dispositivo. El intento de conexión se inició antes de completar el proceso de emparejamiento                            | Complete correctamente el proceso de emparejamiento por PIN; ejecute de nuevo la solicitud de conexión                                                                                                                                               |
| E\_SERVERNOTAUTHORIZED  | 0x8C114009 | El cliente rechazó al dispositivo.                              | El dispositivo de destino no está en la lista de puntos de conexión de confianza del cliente. El intento de conexión se inició antes de completar el proceso de emparejamiento       | Complete correctamente el proceso de emparejamiento por PIN; ejecute de nuevo la solicitud de conexión                                                                                                                                               |
| E\_SERVERTOOOLD         | 0x8C114011 | La versión del servidor es demasiado antigua para este cliente. | La versión de la API en el lado del cliente es más reciente que la versión del punto de conexión en el dispositivo remoto                                                            | Actualice wdEndpoint en la máquina remota a una versión compatible                                                                                                                                                                                   |
| E\_ADMIN\_REQUIRED      | 0x8C114016 | Se requieren privilegios de administrador.                      | El punto de conexión no se está ejecutando con privilegios elevados y la operación requiere permisos de nivel de administrador                                                       | Vuelva a ejecutar el punto de conexión como administrador                                                                                                                                                                                            |

## Comentarios

`WdRemoteCopy` es una llamada sincrónica de bloqueo. No devuelve un valor hasta que se hayan copiado todos los archivos, se cancele la operación mediante [WdCancelRemoteCopy](/reference/remoting/functions/wdcancelremotecopy) o se produzca un error.

Para habilitar la cancelación, cree un [WdCancellationHandle](/reference/remoting/structs/wdcancellationhandle) mediante [WdCreateCancellationHandle](/reference/remoting/functions/wdcreatecancellationhandle) antes de llamar a `WdRemoteCopy` y, a continuación, páselo a [WdCancelRemoteCopy](/reference/remoting/functions/wdcancelremotecopy) desde un subproceso independiente. Cuando `WdRemoteCopy` devuelva un valor, cierre el identificador con [WdCloseCancellationHandle](/reference/remoting/functions/wdclosecancellationhandle).

La función admitirá la copia bidireccional; sin embargo, CopyFrom no está implementada actualmente y devolverá E\_NOTIMPL si se usa. Use [WdCopyDirection::CopyTo](/reference/remoting/enums/wdcopydirection) para enviar archivos desde el PC local al dispositivo remoto. La dirección predeterminada es `CopyTo`.

Si `destinationPath` es una ruta de acceso absoluta, el `commonRootAlias` de [WdCopyOptions](/reference/remoting/structs/wdcopyoptions) se omite. Si `destinationPath` es una ruta de acceso relativa, se usa la ubicación de raíz común predeterminada, a menos que se especifique un `commonRootAlias`.

Para recibir actualizaciones de progreso durante la copia, proporcione una estructura [WdCopyStatusCallbacks](/reference/remoting/structs/wdcopystatuscallbacks) con punteros a funciones de devolución de llamada.

<Info>Solo puede haber una llamada a `WdRemoteCopy` activa a la vez, independientemente del dispositivo de destino o de la ruta de acceso de destino. Llamar a `WdRemoteCopy` mientras hay otra copia en curso da lugar a un comportamiento indefinido.</Info>

`WdRemoteCopy` no reintenta automáticamente en caso de error. Si la operación falla debido a una interrupción de la red, el autor de la llamada debe volver a invocar a `WdRemoteCopy`. Los archivos que se copiaron correctamente antes del error permanecen en el destino: el comportamiento de copia diferencial garantiza que en el reintento solo se vuelvan a transferir los archivos incompletos o que falten. No hay tiempo de espera; la copia continúa hasta que se completa, se produce un error o se cancela.

## Ejemplos

### Ejemplo 1: Copia de archivos básica

Copia una carpeta de compilación local a un dispositivo remoto usando la configuración predeterminada. Se copian todos los archivos sin filtrado, informes de progreso ni compatibilidad con la cancelación.

```cpp theme={null}
// BasicCopy.cpp
// Copies a local build folder to a remote device.
// Build: Link against wdremoteapi.lib

#include <windows.h>
#include <stdio.h>
#include "WdRemoteIteration.h"

int main()
{
    // TODO: Replace with your remote device IP address or hostname
    const char* remoteDevice = "192.168.1.100";

    // TODO: Replace with the path to your local build output
    const char* sourcePath = "C:\\builds\\MyGame";

    // TODO: Replace with the desired folder name on the remote device.
    // Relative paths resolve against the default common root.
    const char* destinationPath = "MyGame";

    HRESULT hr = WdRemoteCopy(
        remoteDevice,
        sourcePath,
        destinationPath,
        nullptr,    // copyOptions — defaults to CopyTo direction, default common root
        nullptr,    // searchOptions — copies all files
        nullptr,    // statusCallbacks — no progress reporting
        nullptr);   // cancellationHandle — no cancellation support

    if (SUCCEEDED(hr))
    {
        printf("Copy completed successfully.\n");
    }
    else
    {
        printf("Copy failed: HRESULT 0x%08X\n", hr);
    }

    return hr;
}
```

### Ejemplo 2: Copia filtrada con informes de progreso

Copia solo tipos de archivo específicos y omite los artefactos de depuración y los directorios intermedios. Una devolución de llamada de progreso imprime el estado de la transferencia en directo en la consola.

```cpp theme={null}
// FilteredCopyWithProgress.cpp
// Copies selected file types with live progress output.
// Build: Link against wdremoteapi.lib

#include <windows.h>
#include <stdio.h>
#include "WdRemoteIteration.h"

HRESULT OnProgress(
    size_t fileProgressCount,
    const WdCopyFileProgressInfo* fileUpdates,
    const WdCopyOperationSummary* summary,
    void* context)
{
    if (summary->totalByteCount > 0)
    {
        double pct = (double)summary->bytesTransferredCount
                   / summary->totalByteCount * 100.0;
        printf("\rProgress: %.1f%% (%llu/%llu files)",
               pct, summary->filesCompletedCount, summary->totalFileCount);
    }
    return S_OK;  // Return S_OK to continue; a failure code aborts the copy
}

int main()
{
    const char* remoteDevice = "192.168.1.100";
    const char* sourcePath   = "C:\\builds\\MyGame";
    const char* destPath     = "MyGame";

    // Only copy executables and data; skip debug symbols and temp files
    WdCopySearchOptions searchOptions = {};
    searchOptions.includeFilePattern   = "*.exe;*.dll;*.ini;*.pak";
    searchOptions.excludeFilePattern   = "*.pdb;*.log;*.tmp";
    searchOptions.excludeDirPattern    = ".vs;obj;Temp;Intermediate";
    searchOptions.includeFileAttributes = 0;  // No attribute-based include filter
    searchOptions.excludeFileAttributes = 0;  // No attribute-based exclude filter

    // Receive progress updates every 500 ms
    WdCopyStatusCallbacks callbacks = {};
    callbacks.copyFilesStatusCallback = OnProgress;
    callbacks.refreshRateMs           = 500;
    callbacks.copyErrorCallback       = nullptr;
    callbacks.context                 = nullptr;

    HRESULT hr = WdRemoteCopy(
        remoteDevice,
        sourcePath,
        destPath,
        nullptr,          // copyOptions — defaults
        &searchOptions,
        &callbacks,
        nullptr);         // cancellationHandle — no cancellation support

    printf("\n");  // Newline after carriage-return progress output

    if (SUCCEEDED(hr))
    {
        printf("Copy completed successfully.\n");
    }
    else
    {
        printf("Copy failed: HRESULT 0x%08X\n", hr);
    }

    return hr;
}
```

## Requisitos

| Requisito                           | Valor                              |
| ----------------------------------- | ---------------------------------- |
| **Encabezado**                      | WdRemoteIteration.h                |
| **Biblioteca**                      | wdremoteapi.lib                    |
| **Sistemas operativos compatibles** | Windows 11 y versiones posteriores |
| **Arquitecturas compatibles**       | x64, ARM64                         |

## Consulte también

* [WdCancelRemoteCopy](/reference/remoting/functions/wdcancelremotecopy)
* [WdCancellationHandle](/reference/remoting/structs/wdcancellationhandle)
* [WdCreateCancellationHandle](/reference/remoting/functions/wdcreatecancellationhandle)
* [WdCloseCancellationHandle](/reference/remoting/functions/wdclosecancellationhandle)
* [WdCopyOptions](/reference/remoting/structs/wdcopyoptions)
* [WdCopySearchOptions](/reference/remoting/structs/wdcopysearchoptions)
* [WdCopyStatusCallbacks](/reference/remoting/structs/wdcopystatuscallbacks)
* [WdCopyDirection](/reference/remoting/enums/wdcopydirection)
* [Códigos de error de la API XBOX PC Remote Iteration](/reference/remoting/error-codes)
* [API XBOX PC Remote Iteration](/reference/remoting/remoteiteration_members)


## Related topics

- [WdCancelRemoteCopy](/es/reference/remoting/functions/wdcancelremotecopy.md)
- [WdCopyOptions](/es/reference/remoting/structs/wdcopyoptions.md)
- [WdCopyDirection](/es/reference/remoting/enums/wdcopydirection.md)
- [WdCopyStatusCallbacks](/es/reference/remoting/structs/wdcopystatuscallbacks.md)
- [WdCopyFilesStatusCallback](/es/reference/remoting/callbacks/wdcopyfilesstatuscallback.md)
