如何让UWP中StorageFile.DisplayName统一排除FileType?
问题根源与解决方案
我之前也碰到过这个头疼的问题,其实DisplayName的行为差异完全是系统对不同文件夹的默认视图规则在起作用:
- 应用私有目录(比如
LocalFolder):系统默认不开启“隐藏已知文件类型扩展名”的设置,所以DisplayName会直接返回完整的文件名(包含扩展名)。 - 公共媒体库(比如
PictureLibrary):系统默认启用了隐藏已知扩展名的视图选项,因此DisplayName会自动剥离扩展名,只返回文件名主体。
想要在AppData目录下实现不带扩展名的DisplayName,根本不需要做字符串截取这类 workaround,直接修改文件的系统属性就能精准控制,具体步骤如下:
具体实现代码
创建文件后,直接设置文件的System.DisplayName属性:
using System.IO; using System.Collections.Generic; using Windows.Storage; var fileName = "Test.gif"; var folderCreationOption = CreationCollisionOption.OpenIfExists; var fileCreationOption = CreationCollisionOption.ReplaceExisting; // 在LocalFolder创建目标文件 var settingsFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("SettingsFolder", folderCreationOption); var file = await settingsFolder.CreateFileAsync(fileName, fileCreationOption); // 手动设置DisplayName为不带扩展名的名称 var propertyDict = new Dictionary<string, object>(); // 直接指定System.DisplayName属性值 propertyDict["System.DisplayName"] = Path.GetFileNameWithoutExtension(fileName); // 保存属性修改 await file.Properties.SavePropertiesAsync(propertyDict); // 验证结果:此时file.DisplayName将返回"Test" var finalDisplayName = file.DisplayName;
原理说明
StorageFile.DisplayName并非直接返回原始文件名,而是读取文件的System.DisplayName系统属性。如果这个属性没有被手动设置,系统会根据当前文件夹的视图规则自动生成:
- 私有目录下默认生成带扩展名的名称
- 媒体库下默认生成不带扩展名的名称
通过手动设置System.DisplayName属性,我们可以完全控制这个值的输出,彻底摆脱系统视图规则的影响。
内容的提问来源于stack exchange,提问作者Octopus
相关产品推荐
相关产品推荐

