C#如何判断目录是否存在子文件夹,避免调用First方法触发序列无元素异常
实现方案
1. 构造函数逻辑修改
按照要求,在调用CheckIfImagesExist()前增加子目录存在性判断,仅当至少一个目标路径下存在子目录时才执行调用,修改后的构造函数代码如下:
public Form1() { InitializeComponent(); bool hasRadarSubDir = false; bool hasSatelliteSubDir = false; // 处理雷达路径 if (!string.IsNullOrEmpty(textBoxRadarPath.Text)) { if (!Directory.Exists(textBoxRadarPath.Text)) { Directory.CreateDirectory(textBoxRadarPath.Text); btnStart.Enabled = true; } else { // 判断该路径下是否存在子目录 hasRadarSubDir = Directory.GetDirectories(textBoxRadarPath.Text).Any(); } } // 处理卫星路径 if (!string.IsNullOrEmpty(textBoxSatellitePath.Text)) { if (!Directory.Exists(textBoxSatellitePath.Text)) { Directory.CreateDirectory(textBoxSatellitePath.Text); btnStart.Enabled = true; } else { // 判断该路径下是否存在子目录 hasSatelliteSubDir = Directory.GetDirectories(textBoxSatellitePath.Text).Any(); } } // 仅当至少一个路径存在子目录时调用方法 if (hasRadarSubDir || hasSatelliteSubDir) { CheckIfImagesExist(); } }
注:代码中用
string.IsNullOrEmpty替代直接判空,兼容文本框为null的边界情况,Any()方法比获取数组后判断长度性能更优。
2. 可选:方法兜底防护(推荐添加)
为了避免后续其他场景调用GetImagesFiles时触发相同异常,建议对获取最新子目录的逻辑增加空判断,用FirstOrDefault替代First,修改对应代码块如下:
雷达路径逻辑修改
else { var t = new DirectoryInfo(textBoxRadarPath.Text).GetDirectories() .OrderByDescending(d => d.LastWriteTimeUtc) .FirstOrDefault(); // 仅当子目录存在时才读取文件 if (t != null) { filesRadar = System.IO.Directory.GetFiles(t.FullName, "*.gif", SearchOption.AllDirectories).OrderBy(x => x).ToArray(); Array.Sort(filesRadar, new MyComparer(true)); } }
卫星路径逻辑修改
else { var t = new DirectoryInfo(textBoxSatellitePath.Text).GetDirectories() .OrderByDescending(d => d.LastWriteTimeUtc) .FirstOrDefault(); // 仅当子目录存在时才读取文件 if (t != null) { filesSatellite = System.IO.Directory.GetFiles(t.FullName, "*.gif", SearchOption.AllDirectories).OrderBy(x => x).ToArray(); Array.Sort(filesSatellite, new MyComparer(false)); } }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

