文件无法复制报错:路径含非法字符<,回车触发失效但鼠标点击正常
问题解决思路及方案
核心原因分析
报错「Illegal char < at index 14: Levels\default」明确指向路径字符串中包含非法字符<,相同逻辑在鼠标事件中正常,说明问题出在回车触发时的路径变量取值或拼接逻辑上——大概率是panel.levelRename在回车场景下被赋值了包含<的非法内容,或是路径拼接时出现异常。
具体解决步骤
1. 定位非法字符来源
在回车事件代码块中添加路径打印语句,明确触发错误的具体路径:
case KeyEvent.VK_ENTER -> { String sourcePath = panel.level[panel.levelPage].levelPath; String destPath = panel.path + panel.levelRename; // 打印路径排查问题 System.out.println("源路径:" + sourcePath); System.out.println("目标路径:" + destPath); if (new File(sourcePath).exists()) { copyFile(new File(sourcePath), new File(destPath)); // 后续删除代码... } }
运行后查看控制台输出,确认是源路径还是目标路径包含<,重点关注panel.levelRename的内容。
2. 修复路径拼接逻辑
不要直接用字符串拼接路径,改用File的多参数构造方法,它会自动处理系统路径分隔符,避免拼接错误:
// 替换原路径拼接方式 File destFile = new File(panel.path, panel.levelRename);
3. 过滤文件名中的非法字符
Windows系统下文件名禁止包含\/:*?"<>|这些字符,添加工具方法过滤非法内容:
private static String filterInvalidFileName(String fileName) { // 匹配所有Windows文件名非法字符 String invalidPattern = "[\\\\/:*?\"<>|]"; // 用下划线替换非法字符 return fileName.replaceAll(invalidPattern, "_"); }
在回车事件中使用过滤后的文件名:
case KeyEvent.VK_ENTER -> { String sourcePath = panel.level[panel.levelPage].levelPath; // 过滤非法字符 String validRename = filterInvalidFileName(panel.levelRename); File destFile = new File(panel.path, validRename); if (new File(sourcePath).exists()) { copyFile(new File(sourcePath), destFile); try { Files.delete(Paths.get(sourcePath)); } catch (IOException ex) { ex.printStackTrace(); } } }
4. 检查回车事件的输入逻辑
如果panel.levelRename来自输入框,确认回车触发时是否直接读取了用户未过滤的输入(比如用户输入了<),需要在输入框内容变更或回车事件中提前做过滤,避免非法字符流入变量。
内容的提问来源于stack exchange,提问作者Dodly Game
相关产品推荐
相关产品推荐

