File.WriteAllText创建文件无法访问:HRESULT E_FAIL COM组件调用错误
问题分析与修复方案
问题现象
- 按钮点击事件执行后,生成的JSON文件未出现在用户指定的文件夹,仅显示在文件资源管理器快速访问栏
- 使用VS2022打开该文件时,报错:
Error HRESULT E_FAIL has been returned from a call to a COM component.(中文翻译:调用COM组件时返回了错误HRESULT E_FAIL)
代码问题定位
原代码存在两处关键错误:
- 文件路径逻辑错误:在调用
gunSave.ShowDialog()前就获取了path,此时gunSave.FileName仅为文件名,Path.GetFullPath()会默认使用程序运行目录作为根路径,而非用户选择的目标目录 - 未持久化设置:修改
Properties.Settings.Default.currentGunPath后未调用保存方法,导致用户选择的目录无法被后续逻辑正确读取 - 文件过滤器格式错误:
"Json files | .json"缺少通配符*,不符合标准文件过滤器格式
修复后的代码
{ if (gunFolder.ShowDialog() == DialogResult.OK) { Properties.Settings.Default.currentGunPath = gunFolder.SelectedPath; Properties.Settings.Default.Save(); // 保存用户选择的目录设置 } Dictionary<string, object> savedgun = new Dictionary<string, object>() { {"Ranged Weapon", txtRangedWeapon.Text } }; gunSave.FileName = txtRangedWeapon.Text; gunSave.InitialDirectory = Properties.Settings.Default.currentGunPath; gunSave.Filter = "Json files | *.json"; // 修正过滤器格式 gunSave.Title = "Save the Gun"; if (gunSave.ShowDialog() == DialogResult.OK) { // 直接使用对话框返回的完整路径 string json = JsonConvert.SerializeObject(savedgun); File.WriteAllText(gunSave.FileName, json); } }
关键修复点说明
- 持久化用户设置:添加
Properties.Settings.Default.Save(),确保用户选择的目录路径被永久保存 - 修正路径获取逻辑:在用户确认保存路径后,直接使用
gunSave.FileName获取包含目录的完整路径,避免路径计算错误 - 规范文件过滤器:将过滤器改为
"Json files | *.json",确保对话框仅显示JSON格式文件
内容的提问来源于stack exchange,提问作者Porkupine EXE
相关产品推荐
相关产品推荐

