You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码问题定位

原代码存在两处关键错误:

  1. 文件路径逻辑错误:在调用gunSave.ShowDialog()前就获取了path,此时gunSave.FileName仅为文件名,Path.GetFullPath()会默认使用程序运行目录作为根路径,而非用户选择的目标目录
  2. 未持久化设置:修改Properties.Settings.Default.currentGunPath后未调用保存方法,导致用户选择的目录无法被后续逻辑正确读取
  3. 文件过滤器格式错误:"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:45:33