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
相关产品推荐
相关产品推荐

