2016-05-23 3 views
1

Я работаю над приложением Windows 10 UWP, которое использует OneDrive API в C#.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. Если он существует, он возвращает Id из папки old или создает папку old, а затем возвращает ее Id.

Как вы можете видеть, мой подход не очень приятный, но я не знаю, как это сделать лучше, и не запускайте его (создание папки - проблема здесь). Я мог бы загрузить нулевой файл и тем самым создать папку автоматически, а затем удалить ее снова, но я не хочу этого делать.

Как я могу подойти к этому лучше и профессиональнее? Tahnk вы очень заблаговременно

ответ

1

Я положил в класс, например. ClassA, то он выглядит в специальной папке, где только мое приложение имеет доступ к этому ClassA и ищет папку с именем old. Если он существует, он возвращает идентификатор старой папки или создает старую папку, а затем возвращает идентификатор.

Я не могу понять ваш ClassA здесь, вы имеете в виду вы хотите, чтобы сделать эту работу в Class вашем приложении?

В любом случае, я написал образец здесь, который может получить папку моего приложения в OneDrive и найти, есть ли подпапка с именем «old» внутри, если да, верните идентификатор этой папки, если нет, создайте его и верните идентификатор этой новой папки.

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; 
} 

Как вы можете видеть здесь, я поставил код для получения идентификатора в случае кнопки мыши, если вы хотите получить доступ к нему в класс, вы можете попытаться поместить этот код в конструкторе вашего класса.

Кстати, я не использовал Search и Filter Api здесь, чтобы найти папку, моя цель состояла в том, чтобы выделить папку с именем «old» и файлы с именем «old», например «old.txt», по умолчанию если вы ищете «старый», в результат будет добавлен «old.txt». На данный момент я не нашел способ использовать фильтр Q для поиска определенного типа, вы можете попробовать.

+0

Хммм Я думаю, что вещь 'ClassA' более запутанна в вопросе, чем помогает. Во всяком случае, ваш ответ - то, на что я надеялся. Вещь с классом заключается в том, что у меня есть интерфейс и несколько классов наследуют этот интерфейс. Классы - это записи в базе данных, и я хочу поместить каждую запись класса в общую папку. Имя каждой записи определяет, если она более новая или то же самое во время синхронизации, и я могу обойтись без дельта-синхронизации, которая для меня все еще довольно запутанна. – user3079834

+0

@ user3079834, звучит довольно сложно для меня, где ваша база данных? Разве это не нормально, если вы просто загрузите файл базы данных на OneDrive? В любом случае, если у вас есть другие проблемы, можете задать здесь новый вопрос. –

+0

Feng: база данных локально, но я хочу синхронизировать с несколькими устройствами, и поскольку пользователь будет вносить изменения в базу данных и/или добавлять записи довольно часто, я обнаружил, что каждый раз синхронизировал db как слишком много времени и использования данных, поэтому Я решил скорее синхронизировать каждую запись, и когда она изменилась, мне просто нужно загрузить эту конкретную запись.вот где интерфейс и классы входят в игру: каждая запись имеет свой собственный уникальный идентификатор и дату и время последнего обновления. Это объединение делает имя файла на OneDrive. Как я упоминал выше, это не профессионально, но я думаю, что работает – user3079834

Смежные вопросы