> ## 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.

# XGameSaveReadBlobData

> XGameSaveReadBlobData

# XGameSaveReadBlobData

Lit les données de blob d'un conteneur.

## Syntaxe

```cpp theme={null}
HRESULT XGameSaveReadBlobData(  
         XGameSaveContainerHandle container,  
         const char** blobNames,  
         uint32_t* countOfBlobs,  
         size_t blobsSize,  
         XGameSaveBlob* blobData  
)  
```

### Paramètres

*container*   \_In\_\
Type : XGameSaveContainerHandle

Handle vers le **XGameSaveContainer** contenant les données XGameSaveBlob.

*blobNames*   \_In\_opt\_z\_count\_(*countOfBlobs)\
Type : char*\*

Pointeur vers un tableau de chaînes représentant les noms des [XGameSaveBlob](/fr/reference/system/xgamesave/structs/xgamesaveblob).

*countOfBlobs*   \_Inout\_\
Type : uint32\_t\*

Nombre de blobs à lire.

*blobsSize*   \_In\_\
Type : size\_t

Taille des données de blob allouées ; elle peut être déduite de la lecture des métadonnées du blob.

*blobData*   \_Out\_writes\_bytes\_(blobsSize)\
Type : [XGameSaveBlob\*](/fr/reference/system/xgamesave/structs/xgamesaveblob)

Pointeur [XGameSaveBlob](/fr/reference/system/xgamesave/structs/xgamesaveblob) destiné à contenir les données de blob. La mémoire allouée doit permettre de stocker tous les blobs demandés au conteneur.

### Valeur de retour

Type : HRESULT

Résultat de la fonction.

#### Erreurs courantes

* E\_GS\_INVALID\_CONTAINER\_NAME
* E\_GS\_PROVIDED\_BUFFER\_TOO\_SMALL
* E\_GS\_BLOB\_NOT\_FOUND
* E\_GS\_CONTAINER\_NOT\_IN\_SYNC
* E\_GS\_CONTAINER\_SYNC\_FAILED
* E\_GS\_HANDLE\_EXPIRED

## Remarques

<Note>Cette fonction ne peut pas être appelée sans risque sur un thread à durée critique. Pour plus d'informations, consultez [Threads à durée critique](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads).</Note>

Utilisez cette fonction pour lire les données d'un blob de sauvegarde de jeu. La fonction renvoie le nombre de blobs et les données d'un conteneur de blobs. Vous pouvez les utiliser pour itérer sur les blobs d'un conteneur afin de lire les informations appropriées. Il existe une version asynchrone de cette fonction, appelée [XGameSaveReadBlobDataAsync](/fr/reference/system/xgamesave/functions/xgamesavereadblobdataasync).

```cpp theme={null}
// SYNC Read - should not be called on time sensitive thread 
//             as this will block until the operation is complete 
void Sample::_ReadContainerBlobsSync(const XGameSaveContainerInfo* container) 
{ 
    const char* blobNames[] = { 
        "WorldState", 
        "PlayerState", 
        "PlayerInventory" 
    }; 
  
    XGameSaveContainerHandle containerContext = nullptr; 
    size_t allocSize; 
    uint32_t countOfBlobs = _countof(blobNames); 
    XGameSaveBlob* blobs = nullptr; 
    HRESULT hr = XGameSaveCreateContainer(_provider, container->name, &containerContext); 
  
    if (SUCCEEDED(hr)) 
    { 
        // this method finds the size for only the blobs in the container 
        // that we are requesting to read right now 
        hr = _GetContainerBlobsDataSize(container, blobNames, _countof(blobNames), &allocSize); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        blobs = reinterpret_cast<XGameSaveBlob*>(malloc(allocSize)); 
        if (blobs == nullptr) 
        { 
            hr = E_OUTOFMEMORY; 
        } 
    } 
    if (SUCCEEDED(hr)) 
    { 
        hr = XGameSaveReadBlobData(containerContext, blobNames, &countOfBlobs, allocSize, blobs); 
    } 
    if (SUCCEEDED(hr)) 
    { 
        if (countOfBlobs == _countof(blobNames)) 
        { 
            for (uint32_t i = 0; i < countOfBlobs; i++) 
            { 
                XGameSaveBlob* currentBlob = blobs + i; 
                if (strcmp(currentBlob->info.name, "WorldState") == 0) 
                { 
                    hr = _LoadSaveBlob(currentBlob, _worldState); 
                } 
                else if (strcmp(currentBlob->info.name, "PlayerState") == 0) 
                { 
                    hr = _LoadSaveBlob(currentBlob, _playerState); 
                } 
                else if (strcmp(currentBlob->info.name, "PlayerInventory") == 0) 
                { 
                    hr = _LoadSaveBlob(currentBlob, _playerInventory); 
                } 
                if (FAILED(hr)) 
                { 
                    break; 
                } 
            } 
        } 
        else 
        { 
            hr = E_UNEXPECTED; 
        } 
    } 
  
    _HandleContainerBlobErrors(hr); 
  
    if (blobs != nullptr) 
    { 
        free(blobs); 
    } 
    if (containerContext != nullptr) 
    { 
        XGameSaveCloseContainer(containerContext); 
    } 
} 
  
  
void Sample::_HandleContainerBlobErrors(HRESULT hr) 
{ 
    // set some state 
    switch (hr) 
    { 
    case E_GS_INVALID_CONTAINER_NAME: 
        // tried to access a container with an invalid name 
        break; 
    case E_GS_PROVIDED_BUFFER_TOO_SMALL: 
        // shouldn't ever happen unless our math is wrong!! 
        break; 
    case E_GS_BLOB_NOT_FOUND: 
        // we asked for a blob that isn't in the container 
        break; 
    case E_GS_CONTAINER_NOT_IN_SYNC: 
    case E_GS_CONTAINER_SYNC_FAILED: 
        // need to sync and we are offline ? 
        break; 
    case E_GS_HANDLE_EXPIRED: 
        // need to re-initialize since another device has taken 
        // ownership while we were suspended and/or busy  
        break; 
    } 
} 
```

## Configuration requise

**En-tête :** XGameSave.h

**Bibliothèque :** xgameruntime.lib

**Plateformes prises en charge :** Windows, consoles de la famille XBOX One et consoles XBOX Series

## Documentation conceptuelle

* [Threads à durée critique](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## Voir aussi

[XGameSave](/fr/reference/system/xgamesave/xgamesave_members)\
[XGameSaveBlobInfo](/fr/reference/system/xgamesave/structs/xgamesaveblobinfo)\
[XGameSaveReadBlobDataAsync](/fr/reference/system/xgamesave/functions/xgamesavereadblobdataasync)\
[Débogage des sauvegardes de jeu](/fr/build/core-features/common/game-save/game-saves-debugging)


## Related topics

- [XGameSaveReadBlobData](/ko/reference/system/xgamesave/functions/xgamesavereadblobdata.md)
- [XGameSaveReadBlobDataAsync](/reference/system/xgamesave/functions/xgamesavereadblobdataasync.md)
