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
相关产品推荐
相关产品推荐

