第二次创建目录抛IOException?如何按扩展名迁移文件至对应目录
为啥第二次创建目录会抛异常?我来帮你拆解
首先得纠正一个认知:Directory.CreateDirectory()这个方法本身是很“耐造”的——就算目标目录已经存在,它也不会报错,只会直接返回已有的目录信息。那你第二次调用时触发IOException说“已存在同名文件夹”,大概率是下面这两种情况:
1. 你要创建的目标路径,其实是个文件,不是目录
比如你之前可能在executpath这个目录下,不小心创建过一个叫txt的文件(不是文件夹)。这时候你再想创建同名的文件夹,系统肯定不干啊——同一个路径下不能同时有同名的文件和文件夹,自然就抛异常了。这是最常见的原因。
2. 目录被其他进程锁定/代码逻辑搞乱了状态
这种情况比较少见,比如第一次创建sql目录后,某个其他程序(比如杀毒软件、文件管理器)把这个目录锁定了,或者你的代码里有其他逻辑误操作了目录状态,但这种概率很低。
怎么解决?给你两个实用方案
方案一:创建前先检查并清理同名文件
在创建txt目录前,先看看目标路径是不是个文件,如果是就先删掉或者重命名,再创建目录:
private void InstallProgram() { string _sql = "sql"; string _txt = "txt"; string executpath = "你的执行路径"; // 这里替换成你的实际路径 // 创建sql目录(原来的逻辑没问题) string destSqlDir = Path.Combine(executpath, _sql); Directory.CreateDirectory(destSqlDir); // 处理txt目录的创建 string destTxtDir = Path.Combine(executpath, _txt); if (File.Exists(destTxtDir)) { // 根据你的需求选择:删除文件,或者重命名 File.Delete(destTxtDir); } Directory.CreateDirectory(destTxtDir); // 后续的文件转移逻辑... }
方案二:更严谨的存在性判断
先判断目标路径是不是目录,如果不是,再检查是不是文件,处理后再创建:
string destTxtDir = Path.Combine(executpath, _txt); if (!Directory.Exists(destTxtDir)) { if (File.Exists(destTxtDir)) { File.Delete(destTxtDir); } Directory.CreateDirectory(destTxtDir); }
另外补个小提醒:Directory.CreateDirectory会自动递归创建所有不存在的父目录,所以你完全不用担心父目录不存在的问题,第一次调用成功也印证了这一点~
内容的提问来源于stack exchange,提问作者Ismail Gunes
相关产品推荐
相关产品推荐

