You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中如何用C#结合OneDrive API实现文件同步与管理?

OneDrive API UWP 文件操作实现方案

你已经搞定了OneDrive的登录流程,接下来咱们一步步实现剩下的核心功能。下面的代码都基于你已初始化的oneDriveClient对象,直接复用就行。

1. 创建文件夹

要在OneDrive根目录或者指定路径创建文件夹,用Items.AddAsync方法指定文件夹类型即可:

private async void btn_CreateFolder_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 在根目录创建名为"UWP_Backups"的文件夹
        var newFolder = await oneDriveClient
            .Drive
            .Root
            .Items
            .AddAsync(new Item { Name = "UWP_Backups", Folder = new Folder() });
        
        txtBox_Response.Text = $"文件夹创建成功:{newFolder.Name} (ID: {newFolder.Id})";
    }
    catch (OneDriveException ex)
    {
        txtBox_Response.Text = $"创建文件夹失败:{ex.Error.Message}";
    }
}

如果要在子文件夹里创建,只需把Root换成对应的文件夹ID,比如oneDriveClient.Drive.Items["目标文件夹ID"].Items.AddAsync(...)。

2. 文件上传

支持两种上传方式:小文件直接上传(4MB以内)、大文件分片上传。先给你最常用的小文件上传示例:

private async void btn_UploadFile_Click(object sender, RoutedEventArgs e)
{
    var picker = new FileOpenPicker();
    picker.FileTypeFilter.Add("*"); // 允许选择所有文件类型
    StorageFile fileToUpload = await picker.PickSingleFileAsync();
    
    if (fileToUpload == null) return;

    try
    {
        // 上传到之前创建的"UWP_Backups"文件夹,保留原文件名
        var uploadedItem = await oneDriveClient
            .Drive
            .Root
            .ItemWithPath("UWP_Backups/" + fileToUpload.Name)
            .Content
            .Request()
            .PutAsync<Item>(await fileToUpload.OpenStreamForReadAsync());
        
        txtBox_Response.Text = $"文件上传成功:{uploadedItem.Name}";
    }
    catch (OneDriveException ex)
    {
        txtBox_Response.Text = $"上传失败:{ex.Error.Message}";
    }
}

大文件上传需要用CreateUploadSessionAsync创建上传会话,OneDrive API会自动处理分片逻辑,你可以根据官方流程扩展,核心是分块写入会话流。

3. 文件下载

从OneDrive指定路径下载文件到本地:

private async void btn_DownloadFile_Click(object sender, RoutedEventArgs e)
{
    var picker = new FileSavePicker();
    picker.SuggestedFileName = "备份文件";
    picker.FileTypeChoices.Add("所有文件", new List<string> { "*" });
    StorageFile saveFile = await picker.PickSaveFileAsync();
    
    if (saveFile == null) return;

    try
    {
        // 下载"UWP_Backups"文件夹下的指定文件(替换为你的目标文件名)
        using (var downloadStream = await oneDriveClient
            .Drive
            .Root
            .ItemWithPath("UWP_Backups/test.txt")
            .Content
            .Request()
            .GetAsync())
        using (var localStream = await saveFile.OpenStreamForWriteAsync())
        {
            await downloadStream.CopyToAsync(localStream);
            txtBox_Response.Text = "文件下载完成";
        }
    }
    catch (OneDriveException ex)
    {
        txtBox_Response.Text = $"下载失败:{ex.Error.Message}";
    }
}

4. 文件/文件夹删除

删除指定路径的文件或文件夹,调用DeleteAsync即可:

private async void btn_DeleteItem_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 删除"UWP_Backups"下的test.txt文件
        await oneDriveClient
            .Drive
            .Root
            .ItemWithPath("UWP_Backups/test.txt")
            .Request()
            .DeleteAsync();
        
        txtBox_Response.Text = "文件删除成功";
    }
    catch (OneDriveException ex)
    {
        txtBox_Response.Text = $"删除失败:{ex.Error.Message}";
    }
}

5. 修改同步(文件更新)

本地文件修改后,直接覆盖上传即可,OneDrive会自动替换现有文件:

private async void btn_UpdateFile_Click(object sender, RoutedEventArgs e)
{
    var picker = new FileOpenPicker();
    picker.FileTypeFilter.Add("*");
    StorageFile updatedFile = await picker.PickSingleFileAsync();
    
    if (updatedFile == null) return;

    try
    {
        // 覆盖OneDrive上的同名文件
        var updatedItem = await oneDriveClient
            .Drive
            .Root
            .ItemWithPath("UWP_Backups/" + updatedFile.Name)
            .Content
            .Request()
            .PutAsync<Item>(await updatedFile.OpenStreamForReadAsync());
        
        txtBox_Response.Text = $"文件更新成功:{updatedItem.Name}";
    }
    catch (OneDriveException ex)
    {
        txtBox_Response.Text = $"更新失败:{ex.Error.Message}";
    }
}

额外注意事项

  • 权限范围:确保初始化客户端时的scopes包含所需权限,比如Files.ReadWrite.All、offline_access(用于持久登录的令牌刷新)。你的登录代码里scopes可以设置为:
    var scopes = new List<string> { "Files.ReadWrite.All", "offline_access", "User.Read" };
    
  • 驱动器ID获取:你代码里的btn_GetDriveId按钮可以这样实现功能:
    private async void btn_GetDriveId_Click(object sender, RoutedEventArgs e)
    {
        var drive = await oneDriveClient.Drive.Request().GetAsync();
        txtBox_Response.Text = $"默认驱动器ID:{drive.Id}";
    }
    
  • 错误处理:每个操作都建议捕获OneDriveException,可以根据OneDriveErrorCode做更细致的场景处理,比如文件不存在、权限不足等。

这些代码可以直接集成到你的UWP项目中,和已有的登录逻辑无缝衔接。相比于Dropbox和Google Drive的UWP实现,OneDrive的API确实更贴合UWP生态,开发起来顺畅很多。

内容的提问来源于stack exchange,提问作者fausdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:08:31