2016-05-23 8 views
1

私はWindows 10 UWPアプリケーションで作業しています。これは、C#でOneDrive APIを使用しています。OneDrive-APIが存在しない場合は、フォルダを作成します。

特定のサブフォルダのIdを取得しようとしています(存在しない場合)。これまでのところ、次のようになります。

public async Task<string> getOldFolder<IDBEntry>(IDBEntry objectType) 
{ 
try 
{ 
    // authenticate 
    if (!this.oneDriveClient.IsAuthenticated) 
    { 
     await this.oneDriveClient.AuthenticateAsync(); 
    } 

    var children = await oneDriveClient.Drive.Special.AppRoot.Children.Request().Select("name,id").GetAsync(); // get name and id only (dont need the rest) 
    string retID = string.Empty; 

    string ID = string.Empty; 
    if (children != null) 
    { 
     foreach (var item in children) 
     { 
      var s = item.Name; 
      if (s == objectType.GetType().Name) // class name, e.g. "classA" 
      { 
       ID = item.Id; 
      } 
     } 
    } 

    // cancel, if nothing found 
    if (ID == string.Empty) 
    { 
     return null; 
    } 

    children = await oneDriveClient.Drive.Items[ID].Children.Request().GetAsync(); 
    if (children != null) 
    { 
     foreach (var item in children) 
     { 
      if (item.Name == "old") 
      { 
       retID = item.Id; 
      } 
     } 
    } 

    if (string.IsNullOrEmpty(retID)) 
    { 
     // create folder "old" 
     // this is the part I'm stuck with 
     string itemPath = objectType.GetType().Name + "/" + "old"; 
     Item item = await oneDriveClient.Drive.Special.AppRoot.ItemWithPath(itemPath).Content.Request().PutAsync 
     if (item != null && (!string.IsNullOrEmpty(item.Id))) 
     { 
      retID = item.Id; 
     } 
    } 

    return retID; 
} 
catch (Exception) 
{ 
    return null; 
} 
} 

コードは何をしていますか?私はクラスに入れました。 ClassAの場合は、Special Folderが表示されます。私のアプリケーションのみがClassAにアクセスし、oldというフォルダを検索します。存在する場合は、oldIdを返します。または、oldというフォルダを作成してIdを返します。

私のアプローチは見栄えが良くありませんが、わかりません。どのように改善するか、それを実行する(フォルダを作成することが問題です)。ヌルファイルをアップロードしてフォルダを自動的に作成してから削除することもできますが、そのようにしたくはありません。

私はこれをよりよく、より専門的にアプローチすることができますか? Tahnkは大変お手数です。

答えて

1

私はClassに入れました。 ClassAの場合は、特別なフォルダを表示します。このフォルダでは、自分のアプリケーションのみがこのClassAのアクセス権を持ち、古いフォルダを検索します。存在する場合は、古いフォルダのIDを返すか、古いフォルダを作成してからIDを返します。

私はあなたがここにClassA、あなたはあなたのアプリケーションのClassで、この作業を行うにはしたく意味を理解できないのですか?

ここでは、私のアプリケーションのフォルダをOneDriveに入れて、そこに "old"というサブフォルダがあるかどうかを調べることができます。もしそうなら、このフォルダのIDを返します。この新しいフォルダのIDを作成して返します。あなたがここに見ることができるように

private string ID; 

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     var appfolderitems = await GetAppRoot(); 
     Dictionary<string, string> itemList = new Dictionary<string, string>(); 
     foreach (var item in appfolderitems) 
     { 
      var id = item.Id; 
      var name = item.Name; 
      itemList.Add(id, name); 
     } 
     if (itemList.ContainsValue("old")) 
     { 
      foreach (var item in itemList) 
      { 
       if (item.Value == "old") 
        ID = item.Key; 
      } 
     } 
     else 
     { 
      ID = await CreateFolder(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

private IOneDriveClient driveClient; 

private async Task<IChildrenCollectionPage> GetAppRoot() 
{ 
    driveClient = 
     await OneDriveClientExtensions.GetAuthenticatedUniversalClient(
      new string[] { "onedrive.readwrite", "offline_access" } 
      ); 

    if (!driveClient.IsAuthenticated) return null; 

    var itemRequest = await driveClient.Drive.Special.AppRoot.Children.Request().GetAsync(); 
    return itemRequest; 
} 

private async Task<string> CreateFolder() 
{ 
    if (!driveClient.IsAuthenticated) return null; 
    var folderToCreate = new Item { Name = "old", Folder = new Folder() }; 
    var oldfolder = await driveClient.Drive.Special.AppRoot.Children.Request().AddAsync(folderToCreate); 
    return oldfolder.Id; 
} 

が、私はあなたがクラスでそれにアクセスしたい場合は、ボタンのクリックイベントにIDを取得するためのコードを入れて、あなたは、クラスのコンストラクタで、このコードを配置しようとするかもしれません。

ところで、私はここでフォルダを見つけるために検索とフィルタリングのApiを使用しませんでした。私の目的は、「old」という名前のフォルダと「old.txt」という名前のファイルを区別することでした。 "old"を検索すると、 "old.txt"も結果に追加されます。今のところ私はQフィルターを使用して特定のタイプを検索する方法が見つからなかったので、試してみることができます。

+0

Hmmm「ClassA」のことは、困っているよりも、混乱していると思います。とにかく、あなたの答えは、私が望んでいたものです。クラスのことは、私にはインターフェースがあり、複数のクラスがこのインターフェースを継承しているということです。クラスはデータベースのエントリであり、クラスの各エントリを共有フォルダに入れたいと思います。同期している間にそれが新しいか同じであるかどうかは、各エントリの名前が決定します。同期デルタを使わずに行くことができますが、これはまだかなり混乱しています。 – user3079834

+0

@ user3079834、あなたのデータベースはどこですか? OneDriveにデータベースファイルをアップロードしても問題ありませんか?いずれにしても、他の問題があれば、ここで新しい質問をすることを歓迎します。 –

+0

Feng:データベースはローカルですが、複数のデバイスに同期したいのですが、ユーザーがデータベースを変更したり、エントリを頻繁に追加したりすると、毎回dbを時間とデータの使用量が多すぎると同期させる私はむしろ各エントリ自体を同期することを選択し、変更されたときには、その特定のエントリをダウンロードするだけです。それはインターフェイスとクラスが出現するところです:各エントリーには独自のIDと最後に更新された日時があります。これにより、OneDrive上にファイル名が作成されます。上の記事で触れたように、これは専門的なことではありませんが、 – user3079834

関連する問題