3 Stimmen

OneDrive Upload/Download in angegebenes Verzeichnis

Ich versuche, das Live SDK (v5.6) zu verwenden, um Backup/Wiederherstellung von OneDrive in meiner Windows Phone 8.1 Silverlight-Anwendung zu integrieren. Ich kann in das Standardverzeichnis "me/skydrive" lesen/schreiben, aber ich habe große Schwierigkeiten, einen Weg zu finden, um in ein bestimmtes Verzeichnis hochzuladen/herunterzuladen. Ich kann den Ordner problemlos erstellen, wenn er nicht vorhanden ist.

Ich habe unten versucht, aber ohne Erfolg.

var res = await _client.UploadAsync("me/skydrive/mydir", fileName, isoStoreFileStream, OverwriteOption.Overwrite);

Ich habe auch versucht, die Verzeichnis-ID zu erhalten und diese auch zu übergeben.

var res = await _client.UploadAsync("me/skydrive/" + folderId, fileName, isoStoreFileStream, OverwriteOption.Overwrite);

Gleicher Fehler.. Ich erhalte 'mydir' oder die ID wird nicht unterstützt...

"{request_url_invalid: Microsoft.Live.LiveConnectException: Die URL enthält den Pfad 'mydir', der nicht unterstützt wird."

Irgendwelche Vorschläge? Wenn Sie eine Antwort für das UploadAsync vorschlagen, könnten Sie auch bitte einschließen, wie ich meine Datei aus dem angegebenen Verzeichnis herunterladen könnte? Danke!

11voto

Ertay Shashko Punkte 1247

Hier ist eine Erweiterungsmethode, die überprüft, ob ein Ordner erstellt wurde und:

  1. Wenn erstellt, gibt die Ordner-ID zurück.
  2. Wenn nicht erstellt, erstellt es den Ordner und gibt die Ordner-ID zurück.

Dann können Sie diese ID verwenden, um in diesen Ordner hoch- oder herunterzuladen.

public async static Task CreateDirectoryAsync(this LiveConnectClient client,
string folderName, string parentFolder)
    {
        string folderId = null;

        // Ruft alle Verzeichnisse ab.
        var queryFolder = parentFolder + "/files?filter=folders,albums";
        var opResult = await client.GetAsync(queryFolder);
        dynamic result = opResult.Result;

        foreach (dynamic folder in result.data)
        {
            // Überprüft, ob der aktuelle Ordner den übergebenen Namen hat.
            if (folder.name.ToLowerInvariant() == folderName.ToLowerInvariant())
            {
                folderId = folder.id;
                break;
            }
        }

        if (folderId == null)
        {
            // Verzeichnis wurde nicht gefunden, also wird es mit der PostAsync-Methode erstellt.
            var folderData = new Dictionary();
            folderData.Add("name", folderName);
            opResult = await client.PostAsync(parentFolder, folderData);
            result = opResult.Result;

            // Ruft die ID des erstellten Ordners ab.
            folderId = result.id;
        }

        return folderId;
    }

Sie können dies dann verwenden als:

string skyDriveFolder = await CreateDirectoryAsync(liveConnectClient, "", "me/skydrive");

Jetzt hat skyDriveFolder die Ordner-ID, die Sie beim Hochladen und Herunterladen verwenden können. Hier ist ein Beispiel für das Hochladen:

LiveOperationResult result = await liveConnectClient.UploadAsync(skyDriveFolder, Dateiname,
                                                  DateiStream, OverwriteOption.Overwrite);

ZUSATZ ZUR VOLLSTÄNDIGUNG DER ANTWORT VON YnotDraw

Unter Verwendung dessen, was Sie bereitgestellt haben, hier ist, wie Sie eine Textdatei herunterladen, indem Sie den Dateinamen angeben. Im Folgenden wird nicht darauf eingegangen, ob die Datei nicht gefunden wird und auf andere potenzielle Ausnahmen, aber hier ist, was funktioniert, wenn alles richtig zusammenpasst:

public async static Task DownloadFileAsync(this LiveConnectClient client, string directory, string fileName)
    {
        string skyDriveFolder = await OneDriveHelper.CreateOrGetDirectoryAsync(client, directory, "me/skydrive");
        var result = await client.DownloadAsync(skyDriveFolder);

        var operation = await client.GetAsync(skyDriveFolder + "/files");

        var items = operation.Result["data"] as List;
        string id = string.Empty;

        // Suche nach der Datei - hier wird Handling hinzugefügt, wenn die Datei nicht gefunden wird
        foreach (object item in items)
        {
            IDictionary file = item as IDictionary;
            if (file["name"].ToString() == fileName)
            {
                id = file["id"].ToString();
                break;
            }
        }

        var downloadResult= await client.DownloadAsync(string.Format("{0}/content", id));

        var reader = new StreamReader(downloadResult.Stream);
        string text = await reader.ReadToEndAsync();
        return text;
    }

Und in der Verwendung:

var result = await DownloadFile(_client, "MeinOrdner", "backup.txt");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X