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

C#实现应用内文件复制粘贴功能运行异常求助

问题排查与修复方案

现存问题

  • 路径完全不匹配:复制操作写入了两个文件,分别是程序运行目录下的copy.xaml和C:\Users\copy.xaml,但粘贴操作读取的是d:\temp.txt,三者路径完全不一致,自然读不到复制的内容
  • 已释放对象重复调用:readingStream.Close()执行后,流已经被销毁,后续调用readingStream.CopyTo(destinationStream)属于无效操作,会直接抛出异常,且全局声明的destinationStream全程没有实际使用,属于冗余代码
  • 资源未正确释放:FileStream、MemoryStream都属于需要释放的非托管资源,仅调用Close()没有用using语法自动释放,很容易导致文件被占用,后续粘贴操作读取文件时会报错
  • 路径权限问题:C:\Users\根目录默认需要管理员权限才能写入,普通权限运行程序时写入会直接失败,且你注释了目录创建代码,若目标路径不存在也会导致写入失败
  • 粘贴方法参数传值错误:从方法名判断LoadUnitFromXamlString需要接收XAML格式的字符串参数,但你实际传入了文件路径,且已经读出来的importString完全没有被使用,逻辑完全错误

修复后代码

// 统一使用固定的临时文件路径,优先用系统临时目录避免权限问题
private readonly string _tempCopyFilePath = Path.Combine(Path.GetTempPath(), "copy.xaml");

protected void CopyCommand()
{
    var modelAsString = GetPartialExportString();
    // 直接写入目标文件即可,不需要多余的流操作
    File.WriteAllText(_tempCopyFilePath, modelAsString, Encoding.UTF8);
}

protected void PasteCommand()
{
    // 先判断文件是否存在,避免读取失败
    if (!File.Exists(_tempCopyFilePath))
    {
        // 可在这里添加没有复制内容的提示逻辑
        return;
    }
    string importString = File.ReadAllText(_tempCopyFilePath, Encoding.UTF8);
    // 传入读取到的XAML字符串,而非文件路径
    LoadUnitFromXamlString(importString);
}

额外优化建议

如果只是需要实现应用内部的复制粘贴能力,完全不需要写入本地文件,直接声明一个全局静态变量存储GetPartialExportString()的返回值即可,性能更高也不会有文件读写的各种异常问题。如果需要支持跨应用、重启后仍然可以粘贴的场景,再用本地文件方案即可。

内容的提问来源于stack exchange,提问作者germstrom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 08:36:01