示例#1
0
        public async Task <bool> SaveAsync(T objectGraph)
        {
            if (Equals(objectGraph, null))
            {
                return(false);
            }

            //create a seperate file to write to
            //so if we crash in the middle of this, we should not have corrupted the original file
            IFile file = await _folder.CreateFileAsync(_filename, CreationCollisionOption.GenerateUniqueName);

            bool createdUniqueFile = file.Name != _filename;

            _logger.DebugEx("Created file " + file.Name);

            //TODOlater file add optional transacted writes to PCLStorage
            using (var stream = await file.OpenAsync(FileAccess.ReadAndWrite))
            {
                await _serializer.SerializeAsync(stream, objectGraph);
            }

            /*
             * using (StorageStreamTransaction streamTx = await file.OpenTransactedWriteAsync())
             * {
             *  using (Stream outStream = streamTx.Stream.AsStreamForWrite())
             *  {
             *      await _serializer.SerializeAsync(outStream, objectGraph);
             *  }
             *  await streamTx.CommitAsync();
             * }
             */

            if (createdUniqueFile)
            {
                //rename files
                IFile existingFile = await _folder.CreateFileAsync(_filename, CreationCollisionOption.OpenIfExists);

                _logger.DebugEx("Created or opened file: " + _filename);
                _logger.DebugEx("Moving file " + existingFile.Name + ", to backup ");

                await existingFile.MoveAsync(
                    PortablePath.Combine(_folder.Path, GetBackupFileName(_filename)),
                    NameCollisionOption.ReplaceExisting);

                _logger.DebugEx("Moving file " + file.Name + ", to " + _filename);

                await file.MoveAsync(
                    PortablePath.Combine(_folder.Path, _filename),
                    NameCollisionOption.ReplaceExisting);
            }

            return(true);
        }