2016-05-08 19 views
1

私のアプリケーションでは、OneDriveを使用してデータを同期させています。私はOneDriveにファイルを書き込んでいますが、ローカルの古いデータを新しいOneDriveデータで置き換えることはできません。Onedrive <Item>の内容をローカルファイルに書き込む方法

私の現在のメソッドは、例外をスローせずに完了し、OneDriveのファイルと同じテキストデータを返しません。 このメソッドの目的は、OneDriveファイルのデータをローカルファイルと比較し、OneDriveが新しい場合は、OndeDriveファイルの内容をローカルのStorageFileに書き込み、デシリアライズするために戻します。

private async Task<string> GetSavedDataFileAsync(string filename) 
    { 
     string filepath = _appFolder + @"\" + KOWGame + @"\" + filename; 
     StorageFile localread; 
     BasicProperties localprops = null; 
     string txt; 
     try 
     { 
      localread = await local.GetFileAsync(filepath); 
      localprops = await localread.GetBasicPropertiesAsync(); 
     } 
     catch (FileNotFoundException) 
     { localread = null; } 
     if (_userDrive != null) 
     { 
      if (_userDrive.IsAuthenticated) 
      { 
       try 
       { 
        Item item = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync(); 
        if (item != null) 
        { 
         DateTimeOffset drivemodified = (DateTimeOffset)item.FileSystemInfo.LastModifiedDateTime; 
         if (localprops != null) 
         { 
          if (drivemodified > localprops.DateModified) 
          { 
           Stream stream = await localread.OpenStreamForWriteAsync(); 
           using (stream) 
           { await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync(); } 
          } 
         } 
        } 
       } 
       catch (OneDriveException e) 
       { 
        if (e.IsMatch(OneDriveErrorCode.ActivityLimitReached.ToString())) 
        { string stop; } 
       } 
      } 
     } 
     if (localread == null) return string.Empty; 
     txt = await FileIO.ReadTextAsync(localread); 
     return txt; 
    } 

私はその中で、私は、ローカルファイルのストリームを開くために必要な、私はOneDriveにStorageFileを書くことについてのスタックで見つかった別の答えをリバースエンジニアリングしようとしたが、私は正常に動作して表示されません。

+0

あなたはそれを動作させるために管理していましたか?私のローカルファイルとリモートファイルは決して同じDateTimeOffsetを持たないからです。そして、彼らがいつも異なっているなら、私のアプリは常にダウンロードしてアップロードします。あなたと同じ理由でこのコントロールが必要です。同期を制御します。ありがとう – Dpedrinha

+1

@Dpedrinha要するに、はい。以下の答えで、OneDriveアイテムのコンテンツをローカルファイルに書き込むことができました。私がローカルとオンドライブの比較を行うとき、私のコードは 'var localinfo = localfile.DateModified;'と 'var localtime = localinfo.DateModified;' var oneDtime =(DateTimeOffset)oneDItem.FileSystemInfo.LastModifiedDateTime; switch(oneDtime> locattime) 'あなたにさらなる情報が必要なのかどうか教えてください。私は完全な方法をあなたに送ることができます。 – Lindsay

+0

はい、助けてください。ローカルファイル(StorageFile)にDateModified属性がありません。それはDateCreatedのみです。そして、それは常にリモートファイルとは異なります。 – Dpedrinha

答えて

3

OneDrive項目の内容を取得するには、我々は次の方法を使用が必要です。あなたがOneDrive Itemないその内容を取得している

await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Request().GetAsync(); 

を使用している間

var contentStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync(); 

を。

だから、ローカルファイルへのOnedrive項目の内容を書き込むために、次のようにコードを変更することができます。

if (drivemodified > localprops.DateModified) 
{ 
    using (var stream = await localread.OpenStreamForWriteAsync()) 
    { 
     using (var contentStream = await _userDrive.Drive.Special.AppRoot.ItemWithPath(filepath).Content.Request().GetAsync()) 
     { 
      contentStream.CopyTo(stream); 
     } 
    } 
} 
+0

ありがとうございました、私はそれが必要なものを正確にやっているようです。 – Lindsay

関連する問題