none
Nochmals Zugriffskoordinierung auf ein StorageFile RRS feed

  • Frage

  • Liebe Gemeinde,

    dieses Mal geht es um ein StorageFile, dessen Inhalt ich nach dem Start in ein XmlDocument lade, den dazu erforderlichen String erhalte ich in der folgenden Prozedur:

      /// <summary>
      /// loads text from a text file                               </summary>
      /// <param name="folder">   StorageFolder:   
      ///                 directory containing the file              </param>
      /// <param name="sFile">   string   the file's full name                 </param>               
      /// <returns>        string:   the file's text-type content or
      ///                 null in case of error                 </string>
      private async Task < string > LoadTextFileAsync ( StorageFolder folder, string sFile )
      {
         StorageFile file = null;
         FileAccessMode mode = FileAccessMode.Read;
         ulong size = 0;

         if ( folder == null
            || await folder.TryGetItemAsync ( sFile ) == null )
            return null;
         if ( folder != _folderHLP)
            mode= FileAccessMode.ReadWrite;
         file = await folder.GetFileAsync ( sFile );
         using ( var stream = await file.OpenAsync ( mode ) )
         {
            size = stream.Size;
            using ( var inputStream = stream.GetInputStreamAt ( 0 ) )
            {
                using ( var dataReader = new DataReader ( inputStream ) )
               {
                   uint numBytesLoaded = await dataReader.LoadAsync ( ( uint ) size );
                   return dataReader.ReadString ( numBytesLoaded );
               }
             }
         }
      }

    Das XmlDocument wird währen der Laufzeit der UWP korrekt verändert und bei Beendigung der UWP im Suspending-Eventhandler durch Aufruf der folgenden Prozedur in dem Storagefile gespeichert, von dem in der obigen Prozedur geladen wurde:

      /// <summary>
      /// saves text to a file                                 </summary>
      /// <param name="folder">   StorageFolder:   
      ///                 directory to contain the file              </param>
      /// <param name="sFile">   string   the file's full name                 </param>
      /// <param name="sText">   string:   the text to be saved to the file             </param>
      private async Task SaveTextFileAsync ( StorageFolder folder, string sFile, string sText )
      {
         StorageFile file = null;
         if ( folder != null
             && sFile != null
             && sFile != "" )
         {
            if ( await folder.TryGetItemAsync ( sFile ) == null )
              file = await folder.CreateFileAsync ( sFile );
            else
              file = await folder.GetFileAsync ( sFile );
       *)  using ( var stream = await file.OpenAsync ( FileAccessMode.ReadWrite ) )
            {
               using ( var outputStream = stream.GetOutputStreamAt ( 0 ) )
              {
                 using ( var dataWriter = new DataWriter ( outputStream ) )
                 {
                    dataWriter.WriteString ( sText );
                    await dataWriter.StoreAsync ();
                    await outputStream.FlushAsync ();
                 }
               }
             }
          }
      }

    *)  die UWP scheitert hier bein Offnen des StorageFile, die Veränderungen im XmlDocument werden daher nie abgespechert

    Was verstehe ich falsch, ich dachte durch Einklammern des stream in using werden in Load TextFileAsync alle zugehörigen Resourcen frei gegeben ( bedeutet das auch, dass das StorageFile implizit geschlossen wird ?, wenn ja, warum scheitert die UWP beim neuerlichen Öffnen desStorageFile in SaveTextFileAsync ? )

    Mit Dank im Voraus für Eure Hilfe


    Herbert Stejdir

    Montag, 14. Mai 2018 16:34

Antworten

Alle Antworten