2016-05-23 15 views
1

Ich arbeite an einer Windows 10 UWP App, die die OneDrive API in C# verwendet.OneDrive-API Ordner erstellen, wenn nicht vorhanden

Ich versuche, die Id eines bestimmten Unterordners oder erstellen Sie es, wenn es nicht existiert. So weit sieht es in etwa so aus:

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

Was macht der Code? Ich lege eine Klasse, z.B. ClassA, dann sieht es in der Special Folder, wo nur meine App hat Zugriff auf diese ClassA und sucht nach einem Ordner namens old. Wenn es existiert, gibt es die Id des Ordners old zurück oder es erstellt den Ordner old und gibt dann Id zurück.

Wie Sie sehen können, ist mein Ansatz nicht sehr gut aussehend, aber ich weiß nicht, wie man es besser macht, noch es laufen lassen (Erstellen des Ordners ist das Problem hier). Ich könnte eine Null-Datei hochladen und dadurch den Ordner automatisch erstellen und dann wieder entfernen, aber ich möchte es nicht so machen.

Wie kann ich das besser und professioneller angehen? Tahnk Sie sehr viel im Voraus

Antwort

1

Ich lege in eine Klasse, z. ClassA, dann sieht es im Spezialordner nach, wo nur meine App Zugriff für diesen ClassA hat und sucht nach einem Ordner namens alt. Wenn es existiert, gibt es die ID des Ordners alt zurück, oder es erstellt den alten Ordner und gibt dann die ID zurück.

Ich kann nicht verstehen, Ihre ClassA hier, du meinst du diese Arbeit tun wollen in einem Class Ihrer App?

Irgendwie habe ich hier ein Beispiel geschrieben, das den Ordner meiner App in der OneDrive finden kann, und wenn es einen Unterordner namens "alt" gibt, wenn ja, die ID dieses Ordners zurückgeben, wenn nicht, Erstellen Sie einen und geben Sie die ID dieses neuen Ordners zurück.

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

Wie man hier sehen kann, ich den Code setzen für ID in eine Schaltfläche klicken Ereignis bekommen, wenn Sie es in einer Klasse zugreifen möchten, können Sie versuchen, diesen Code in Konstruktor Ihrer Klasse zu setzen.

Übrigens habe ich Search und Filter Api hier nicht verwendet, um den Ordner zu finden, mein Zweck war es, Ordner namens "alt" und Dateien mit dem Namen "alt", zum Beispiel "old.txt", standardmäßig zu unterscheiden Wenn Sie nach "alt" suchen, wird auch die "old.txt" zum Ergebnis hinzugefügt. Für jetzt habe ich keinen Weg gefunden, Q Filter zu verwenden, um nach dem spezifischen Typ zu suchen, können Sie es versuchen.

+0

Hmmm Ich denke, die 'ClassA' Sache ist verwirrender in der Frage, als zu helfen. Wie auch immer, deine Antwort ist, was ich mir erhofft habe. Die Sache mit der Klasse ist, dass ich eine Schnittstelle habe und mehrere Klassen diese Schnittstelle erben. Die Klassen sind Einträge einer Datenbank und ich möchte jeden Eintrag einer Klasse in einen freigegebenen Ordner stellen. Der Name jedes Eintrags bestimmt, ob es beim Synchronisieren neuer oder gleich ist und ich kann ohne das Sync-Delta gehen, was für mich immer noch ziemlich verwirrend ist. – user3079834

+0

@ user3079834, klingt ziemlich kompliziert für mich, wo ist Ihre Datenbank? Ist das nicht in Ordnung, wenn Sie Ihre Datenbankdatei einfach auf OneDrive hochladen? Wie auch immer, wenn Sie ein anderes Problem haben, können Sie hier eine neue Frage stellen. –

+0

Feng: Die Datenbank ist lokal, aber ich möchte mit mehreren Geräten synchronisieren und da der Benutzer Änderungen an der Datenbank vornehmen und/oder Einträge oft hinzufügen, fand ich die db jedes Mal als zu viel in Zeit und Datenverbrauch zu synchronisieren, so Ich entschied mich, jeden Eintrag selbst zu synchronisieren und wenn er geändert wurde, muss ich nur diesen spezifischen Eintrag herunterladen.Hier kommen die Schnittstelle und die Klassen ins Spiel: Jeder Eintrag hat seine eigene eindeutige ID und ein Datum, an dem er zuletzt aktualisiert wurde. Dies kombiniert den Dateinamen auf OneDrive. Wie ich im obigen Beitrag erwähnte, ist das nicht professionell, aber ich denke, funktioniert – user3079834

Verwandte Themen