2016-05-23 163 views
1

我正在使用Windows 10 UWP應用程序,它使用了c#中的OneDrive APIOneDrive-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

我把一個類,例如, ClassA,那麼它會在特殊文件夾中查找,其中只有我的應用程序可以訪問此ClassA並搜索名爲old的文件夾。如果存在,則返回文件夾舊的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」的文件,例如「old.txt」,默認情況下如果您搜索「舊」,則「old.txt」也將被添加到結果中。目前我沒有找到使用Q過濾器來搜索特定類型的方法,您可以試試。

+0

嗯我覺得'ClassA'的問題比幫助更困惑。無論如何,你的答案是,我希望的。與類的東西是,我有一個接口和多個類繼承這個接口。這些類是數據庫的條目,我想將類的每個條目放入共享文件夾中。每個條目的名稱決定,如果它同時更新或相同,我可以去沒有同步增量,這仍然是我很困惑。 – user3079834

+0

@ user3079834,聽起來相當複雜,你的數據庫在哪裏?如果您只是將數據庫文件上傳到OneDrive,那麼這樣做不行嗎?無論如何,如果您有任何其他問題,歡迎在這裏提出一個新問題。 –

+0

馮:數據庫是本地的,但我想要同步到多個設備,並且由於用戶將對數據庫進行更改和/或經常添加條目,所以我發現每次都會同步數據庫,因爲時間和數據使用量太大,所以我選擇寧願同步每個條目本身,當它更改時,我只需要下載該條目。這就是界面和類的作用:每個條目都有它自己的唯一ID和上次更新的日期時間。這一組合使得OneDrive上的文件名成爲可能。正如我在上面的帖子中提到的,這不是專業的,但我認爲是有效的 – user3079834

相關問題