Question

Dans mon application C ++, je m'assume de lire le fichier iso asynchrone par createfile - avec drapeau chevauché et après - readfile. Cependant, lorsque j'essaie ce code sur un fichier simple (fichier txt par exemple), cela fonctionne. Mais lorsque j'exécute ce code sur le fichier ISO - il échoue. J'ai vu dans MSDN que le fichier compressé ne peut lire que par des appels de synchronisation ReadFile. Les fichiers ISO sont-ils dans cette catégorie? Si oui - avez-vous une autre suggestion comment lire les fichiers ISO Async?

Ceci est mon code:

int _tmain(int argc, _TCHAR* argv[])
{


HANDLE hFile;
    DWORD NumberOfBytesRead = 0, dw;
    BYTE *buf = (BYTE*)malloc(BUF_SIZE*sizeof(BYTE));
    OVERLAPPED overlapped;
    overlapped.Offset = overlapped.OffsetHigh = 0;  
    memset(buf, 0, 1024);

overlapped.hEvent = CreateEvent(NULL, true, false, NULL); 
if(NULL == overlapped.hEvent)
    printf("error");

hFile = CreateFile("xxx.iso",
                  GENERIC_READ,
                  FILE_SHARE_READ,
                  NULL,
                  OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING , 
                  NULL);



if (hFile == INVALID_HANDLE_VALUE)
        printf("invalid hfile\n");

   int i;   
   i= ReadFile(hFile,
                 buf,
                 BUF_SIZE,
                 &NumberOfBytesRead,
        &overlapped);
   if( GetLastError() == ERROR_IO_PENDING)
   {


       dw = WaitForSingleObject(overlapped.hEvent, INFINITE);
    if(dw ==  WAIT_OBJECT_0)
        if (GetOverlappedResult(hFile,&overlapped,&NumberOfBytesRead, TRUE) != 0)   
        {
            if (NumberOfBytesRead != 0) 
            {
                printf("!!!\n");
            }

        }

   }

Merci

Était-ce utile?

La solution

Vous n'avez pas publié la valeur que vous utilisez pour le BUF_SIZE Constante, mais assurez-vous qu'il s'agit d'un multiple entier de la taille du secteur du volume. Il s'agit d'un écueil courant lors de l'utilisation de flux de fichiers non frappés. La documentation pour FILE_FLAG_NO_BUFFERING dans le CreateFile() Documentation dit:

Il existe des exigences strictes pour travailler avec succès avec des fichiers ouverts avec CreateFile à l'aide de l'indicateur FILE_FLAG_NO_BUFFURING, pour plus de détails Tampon de fichiers.

La page sur les notes de mise en mémoire tampon du fichier:

Comme indiqué précédemment, une application doit répondre à certaines exigences lorsque vous travaillez avec des fichiers ouverts avec File_FLAG_NO_BUFUFIERING. Les détails suivants s'appliquent:

  • Les tailles d'accès aux fichiers, y compris le décalage de fichier en option dans la structure superposée, si elles sont spécifiées, doivent être pour un certain nombre d'octets qui est un multiple entier de la taille du secteur du volume. Par exemple, si la taille du secteur est de 512 octets, une application peut demander des lectures et des écritures de 512, 1 024, 1 536 ou 2 048 octets, mais pas de 335, 981 ou 7 171 octets.

  • Les adresses du tampon d'accès aux fichiers pour les opérations de lecture et d'écriture doivent être alignées sur le secteur physique, ce qui signifie aligné sur les adresses en mémoire qui sont des multiples entiers de la taille du secteur physique du volume. Selon le disque, cette exigence peut ne pas être appliquée.

Les développeurs d'applications doivent prendre note que de nouveaux types de dispositifs de stockage sont introduits sur le marché avec une taille de secteur des médias physiques de 4 096 octets.

Sur mon système, cette valeur est 4K et la lecture de quelque chose de plus petit que 4K à la fois produit des erreurs. Dans de nombreux échantillons de code de Microsoft, 1k est la taille du tampon par défaut, donc l'adaptation des exemples conduit souvent à des erreurs avec des E / S non frappées.

Éditer: Assurez-vous également de zéro tous les membres du OVERLAPPED structure. Vous ne définissez pas le Internal et InternalHigh membres à 0. Toujours effacer le OVERLAPPED Structure de la manière suivante:

OVERLAPPED overlapped;
ZeroMemory(&overlapped, sizeof(OVERLAPPED));

Ensuite, vous pouvez définir le décalage du fichier et la poignée de l'événement.

Éditer: Considérez également la note suivante sur le lpNumberOfBytesRead paramètre ReadFile():

Utilisez NULL pour ce paramètre s'il s'agit d'une opération asynchrone pour éviter des résultats potentiellement erronés. [...] Pour plus d'informations, consultez la section Remarques.

Autres conseils

Je suggère de prêter une attention particulière aux chevauchements Offset et OffsetHigh champs, en particulier lors de la lecture d'un fichier avec la taille traversant la limite d'un entier non signé 32 bits. Je crois que le problème auquel vous êtes confronté.

Il serait préférable que vous appeliez getlasterror () comme le dit Dodo même s'il n'y a pas d'erreur. Ce que Readfile revient serait d'une très grande aide. En ce qui concerne les fichiers ISO, je pense que ce sont des types de fichiers compressés. Vous pouvez cependant rechercher pour utiliser la fonction lzread. Ici, jetez un œil à ceci: "

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365226%28v=vs.85%29.aspx
". Vous pouvez également ouvrir le fichier avec lzopenfile.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365225%28v=vs.85%29.aspx
J'espère que cela aiderait. Je ne peux pas trouver grand-chose sur ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top