WPF .NET 5中能否像UWP一样获取文件夹/文件的云服务提供商?
WPF判断文件存储提供商的可行实现方案
方案1:调用WinRT API复用UWP逻辑
WPF项目支持直接调用Windows Runtime API,完全可以复用你之前UWP的实现逻辑,不需要额外适配。
配置要求
- 若使用.NET Core/.NET 5+:在项目文件中将目标框架设置为对应Windows版本,示例:
net8.0-windows10.0.19041.0,同时添加配置<EnableWindowsRuntime>true</EnableWindowsRuntime> - 若使用.NET Framework:安装
Microsoft.Windows.SDK.ContractsNuGet包引入WinRT API支持
示例代码
// 调用文件选择器逻辑和UWP一致 var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail; picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary; picker.FileTypeFilter.Add("*"); // 获取StorageFile实例 Windows.Storage.StorageFile storageFile = await picker.PickSingleFileAsync(); if (storageFile != null) { // 直接获取提供商,返回值和UWP完全一致,包含computer、各云平台名称 var provider = storageFile.Provider; string providerName = provider.DisplayName; }
方案2:自主实现本地检测逻辑
如果不想依赖WinRT API,可以通过路径和标识文件检测实现:
- 判断文件路径属于本地固定磁盘、可移动磁盘时,标记为computer
- 主流云存储同步目录都会生成专属隐藏标识文件,扫描对应路径下的标识即可判断:
- OneDrive:目录下存在
.OneDrive隐藏文件 - Dropbox:目录下存在
.dropbox.cache隐藏文件夹 - Google Drive:目录下存在
desktop.ini包含Google Drive专属标识 - iCloud云盘:路径包含
iCloudDrive关键词,且存在专属元数据文件
- OneDrive:目录下存在
简易示例代码
public string GetStorageProvider(string filePath) { // 先判断是否为本地磁盘 var driveInfo = new DriveInfo(Path.GetPathRoot(filePath)); if (driveInfo.DriveType is DriveType.Fixed or DriveType.Removable or DriveType.CDRom) { // 检测云存储标识 var directory = new DirectoryInfo(filePath); while (directory != null) { if (directory.GetFiles(".OneDrive", SearchOption.TopDirectoryOnly).Any()) return "OneDrive"; if (directory.GetDirectories(".dropbox.cache", SearchOption.TopDirectoryOnly).Any()) return "Dropbox"; // 其他云存储检测逻辑同理添加 directory = directory.Parent; } return "computer"; } return "unknown"; }
内容的提问来源于stack exchange,提问作者Janski
相关产品推荐
相关产品推荐

