none
Ecrire du texte dans un fichier avec Windows Runtime APIs en C++ RRS feed

Toutes les réponses

  • Tout d’abord on va voir comment créer un fichier texte et pour cela on a besoin d’ajouter au début de Code.cpp :

     
    using namespace Windows::Storage;
    using namespace Windows::Storage::Streams;
    

    Puis, pour créer le fichier “words.txt” dans le dossier temporaire (s’il existe déjà il sera remplacé) on ajoute la méthode SaveToFileAsyncdans WordSplitterref class :

     
    void SaveToFileAsync(IVector<String^>^ input)
    {
    StorageFolder^ item = ApplicationData::Current->TemporaryFolder;
    auto createStorageFileOp = item->CreateFileAsync("words.txt", 			CreationCollisionOption::ReplaceExisting);
    createStorageFileOp->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(
    	[input](IAsyncOperation<StorageFile^>^ asyncOp) 
    	{
    		// TODO: Open created file to write content
    	} );
    createStorageFileOp->Start();
    }
    

    Notez, qu’on utilise un handler pour déterminer quand l’action est complète et l’opération est asynchrone (n’oubliez pas d’appeler la méthode Start pour exécuter la tache). Notez aussi que la variable [input] dans l’expression lambda sera accessible plus tard. Finalement, dans HandsOnLab::Mainon appelle SaveToFileAsyncavant return:

    s->SaveToFileAsync(wordList);


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 22 février 2012 16:07
  • Pour ouvrir et écrire des mots dans le fichier on a besoin de plusieurs appels asynchrones en cascade: ouvrir le fichier, écrire dans le stream et enregistrer le stream sur le disque. Dans WordSplitter::SaveToFileAsync, remplacez “//TODO: Open created file to write content” avec

    StreamRetrievalOperation^ streamRetrievalOp = asyncOp->GetResults()->OpenAsync(FileAccessMode::ReadWrite);
    
    streamRetrievalOp->Completed = ref new AsyncOperationCompletedHandler<IRandomAccessStream^>(
    	[input](IAsyncOperation<IRandomAccessStream^>^ asyncOp2) 
    	{
    		IOutputStream^ stream = asyncOp2->GetResults()->GetOutputStreamAt(0);
    		DataWriter^ writer = ref new DataWriter(stream);
    
    		// TODO: write vector content to DataWriter
    
    		DataWriterStoreOperation^ writeBinaryStringOp = writer->StoreAsync();
    
    		writeBinaryStringOp->Completed = ref new AsyncOperationCompletedHandler<unsigned int>(
    			[stream](IAsyncOperation<unsigned int>^ asyncOp3) 
    			{
    				int bytes = asyncOp3->GetResults();
    				stream->FlushAsync()->Start();
    			} );
    		writeBinaryStringOp->Start();
    	} );
    streamRetrievalOp->Start();
    

    Notez de nouveau comment on gère [input] : la variable est accessible dans le prochain appel asynchrone. Il faut remplacer aussi “//TODO: write vector content to DataWriter” avec du code pour parcourir les éléments du vecteur [input] et les ecrire dans le DataWriter :

    std::for_each(begin(input), end(input), [writer](String^ element)
    {
    	writer->WriteString(element);
    	writer->WriteString("\r\n");
    } );


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 22 février 2012 16:09
  • Pour vérifier les modifications ré-exécutez l’application et puis allez dans le dossier C:\Users\[username]\AppData et vérifiez le contenu du fichier “words.txt” :


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 22 février 2012 16:11