【问题标题】:OneDrive-API create folder if not existOneDrive-API 创建文件夹(如果不存在)
【发布时间】:2016-05-25 15:34:01
【问题描述】:

我正在开发一个 Windows 10 UWP 应用程序,它在 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 的文件夹。如果存在,则返回文件夹oldId,或者创建文件夹old,然后返回Id

如您所见,我的方法看起来不是很好,但我不知道如何做得更好,也不让它运行(创建文件夹是这里的问题)。我可以上传一个空文件,从而自动创建文件夹,然后再次将其删除,但我不希望这样做。

我怎样才能更好、更专业地处理这个问题?提前谢谢你

【问题讨论】:

    标签: uwp onedrive


    【解决方案1】:

    我输入了一个类,例如ClassA,然后它在特殊文件夹中查找,只有我的应用程序可以访问这个 ClassA 并搜索一个名为 old 的文件夹。如果存在,则返回文件夹 old 的 Id,或者创建文件夹 old 然后返回 Id。

    我在这里听不懂你的ClassA,你的意思是你想在你的应用程序的Class 中完成这项工作?

    不管怎样,我这里写了一个样例,可以在OneDrive中获取我的app的文件夹,并查找里面是否有一个名为“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 的代码放在按钮单击事件中,如果您想在类中访问它,您可以尝试将此代码放在类的构造函数中。

    顺便说一下,我这里没有使用 Search and Filter Api 来查找文件夹,我的目的是区分名为“old”的文件夹和名为“old”的文件,例如“old.txt”,默认情况下如果您搜索“old”,“old.txt”也将添加到结果中。目前还没有找到使用Q过滤器来搜索具体类型的方法,大家可以试试。

    【讨论】:

    • 嗯,我认为ClassA 的问题比帮助更令人困惑。无论如何,你的答案是,我所希望的。类的问题是,我有一个接口,并且多个类继承了这个接口。这些类是数据库的条目,我想将类的每个条目放入共享文件夹中。每个条目的名称决定了它在同步时是更新的还是相同的,我可以不用同步增量,这对我来说仍然很混乱。
    • @user3079834,对我来说听起来很复杂,你的数据库在哪里?如果您只是将数据库文件上传到 OneDrive,那不行吗?无论如何,如果您有任何其他问题,欢迎在这里提出新问题。
    • 冯:数据库在本地,但我想同步到多个设备,因为用户会经常更改数据库或添加条目,我发现每次同步数据库太多了在时间和数据使用方面,所以我选择同步每个条目本身,当它发生变化时,我只需要下载那个特定的条目。这就是接口和类发挥作用的地方:每个条目都有自己的唯一 ID 和上次更新的日期时间。这种组合使文件名在 OneDrive 上。正如我在上面的帖子中提到的,这不是专业的,但我认为有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2011-01-19
    • 2018-09-05
    • 2018-02-10
    相关资源
    最近更新 更多