Avalonia UI应用新建文件后删除触发FileNotFound Exception问题
问题分析与修复方案
问题根源
创建文件后立即删除触发FileNotFoundException,重启后可正常删除,核心原因是文件路径处理逻辑不一致:
- 保存新文件时,代码通过
Path.Combine(saveDirectory, note.Filename)将文件写入saveDirectory目录,但note.Filename仅存储文件名,未包含完整路径。 - 删除操作直接使用
note.Filename检查文件存在性,此时程序工作目录并非saveDirectory,导致找不到刚创建的文件。 - 重启后加载文件时,程序会从
saveDirectory读取文件并将完整路径赋值给note.Filename,因此删除操作能正常执行。
修复方案
统一文件路径处理逻辑,确保保存和删除操作都基于saveDirectory构建完整路径:
修改SaveToFile方法
移除分支判断,统一拼接完整路径,避免路径不一致:
public static void SaveToFile(NoteModel note) { if (!Directory.Exists(saveDirectory)) { Directory.CreateDirectory(saveDirectory); } try { string filepath = Path.Combine(saveDirectory, note.Filename); File.WriteAllText(filepath, note.Content); } catch (Exception ex) { throw new Exception($"Error saving file: {note.Filename}\nMessage: {ex.Message}"); } }
修改DeleteFile方法
同样基于saveDirectory构建完整路径来检查和删除文件:
public static void DeleteFile(NoteModel note) { if(Directory.Exists(saveDirectory)) { try { string filepath = Path.Combine(saveDirectory, note.Filename); if(File.Exists(filepath)) { File.Delete(filepath); } else { throw new FileNotFoundException($"File not found: {filepath}"); } } catch (Exception ex) { throw new Exception($"Error deleting file: {note.Filename}\nMessage: {ex.Message}"); } } else { throw new DirectoryNotFoundException($"No Save Directory Found: {saveDirectory}"); } }
额外建议
若希望NoteModel.Filename存储完整路径而非仅文件名,可调整逻辑如下:
- 保存时从完整路径中提取目录并确保其存在
- 删除时直接使用完整路径操作
修改后的SaveToFile示例:
public static void SaveToFile(NoteModel note) { string fileDir = Path.GetDirectoryName(note.Filename); if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } try { File.WriteAllText(note.Filename, note.Content); } catch (Exception ex) { throw new Exception($"Error saving file: {note.Filename}\nMessage: {ex.Message}"); } }
内容的提问来源于stack exchange,提问作者Gnome-Improvement713
相关产品推荐
相关产品推荐

