2016-05-23 87 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

相关问题