C#中GetDetailsOf方法返回异常标识而非实际值的问题求助
解决GetDetailsOf返回属性标识而非实际值的问题
问题原因
你遇到的问题主要来自两个方面:
- 属性索引不匹配:
GetDetailsOf的infotype参数对应的属性索引并非固定值,不同Windows版本、语言环境甚至文件夹类型下,同一属性的索引可能存在差异。你传入的索引值可能在当前环境下并不对应目标属性,导致返回属性标识而非实际值。 - 路径格式错误:
ParseName方法需要传入文件夹内的相对路径,如果传入的是绝对路径,会导致无法正确解析出FolderItem,进而返回异常结果。
解决方案
1. 确认当前环境下的正确属性索引
先遍历所有可能的索引,打印对应的属性名称,找到目标属性的正确索引值:
public void ListAllShellProperties(string folderPath) { var shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shell = Activator.CreateInstance(shellAppType); Shell32.Folder objFolder = shell.NameSpace(folderPath); // 遍历0到299的索引,覆盖大部分常见属性 for (int i = 0; i < 300; i++) { string propName = objFolder.GetDetailsOf(null, i); if (!string.IsNullOrWhiteSpace(propName)) { Console.WriteLine($"索引 {i}: {propName}"); } } }
调用该方法后,控制台会输出所有可用属性及其对应索引,找到目标属性(比如“Artist”)的索引后,再将其传入getFileDetails方法。
2. 修正路径格式,使用相对路径
修改getFileDetails方法,将绝对路径转换为相对于文件夹的路径:
public string getFileDetails(string fileFolder, string filePath, int infotype) { string strReturnval = null; try { // 转换为文件夹内的相对路径 string relativePath = Path.GetRelativePath(fileFolder, filePath); var shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shell = Activator.CreateInstance(shellAppType); Shell32.Folder objFolder = shell.NameSpace(fileFolder); Shell32.FolderItem folderItem = objFolder.ParseName(relativePath); if (folderItem != null) { strReturnval = objFolder.GetDetailsOf(folderItem, infotype); } else { Console.WriteLine("无法找到目标文件,请检查路径是否正确"); } } catch (Exception ex) { Console.WriteLine($"错误信息:{ex.Message}"); } finally { Console.WriteLine($"返回值:{strReturnval}"); } return strReturnval; }
额外注意事项
- 确保项目已正确引用
Shell32组件:在项目的“引用”中添加COM组件“Microsoft Shell Controls And Automation”。 - 部分属性仅对特定文件类型有效(比如“Artist”仅对音频文件生效),如果文件类型不匹配,可能返回空值或属性标识。
内容的提问来源于stack exchange,提问作者khirai3
相关产品推荐
相关产品推荐

