C#使用日期时间生成文件夹名时触发异常是什么原因?
异常原因排查
- 核心问题1:路径拼接不规范
你当前直接用+号拼接根路径和文件夹名,没有添加目录分隔符,比如textBoxRadarPath.Text值为C:\RadarDownload时,拼接后得到的是C:\RadarDownloadWed 08.21.2024 At 14.30 PM,这是非法的路径格式,会直接触发ArgumentException或者NotSupportedException异常。
正确的拼接方式应该使用.NET内置的Path.Combine()方法,它会自动处理不同系统的目录分隔符,避免手动拼接出错。 - 核心问题2:无输入合法性校验
你没有对两个textBox的输入值做校验:如果输入为空、输入包含非法路径字符、输入路径指向的位置当前用户没有写入权限,调用Directory.CreateDirectory时都会抛出对应异常。 - 核心问题3:async void事件未处理内部异常
你的猜测是对的,async void类型的事件处理器抛出的未处理异常不会被常规的上层try-catch捕获,会直接触发程序全局未处理异常导致崩溃,这也是你点击continue后程序直接报错的直接原因。
修复代码示例
修复后的CreateDownloadFolders方法
private void CreateDownloadFolders() { // 先校验输入合法性 string radarPath = textBoxRadarPath.Text?.Trim() ?? string.Empty; string satellitePath = textBoxSatellitePath.Text?.Trim() ?? string.Empty; if (string.IsNullOrEmpty(radarPath) || string.IsNullOrEmpty(satellitePath)) { throw new ArgumentException("雷达或卫星下载路径不能为空"); } // 校验路径是否包含非法字符 char[] invalidPathChars = Path.GetInvalidPathChars(); if (radarPath.Any(invalidPathChars.Contains) || satellitePath.Any(invalidPathChars.Contains)) { throw new ArgumentException("路径包含非法字符"); } string date = DateTime.Now.ToString("ddd MM.dd.yyyy"); string time = DateTime.Now.ToString("HH.mm tt"); string folderName = $"{date} At {time}"; // 用Path.Combine拼接路径,自动处理分隔符 string fullRadarFolder = Path.Combine(radarPath, folderName); string fullSatelliteFolder = Path.Combine(satellitePath, folderName); Directory.CreateDirectory(fullRadarFolder); Directory.CreateDirectory(fullSatelliteFolder); }
修复后的点击事件(增加异常捕获)
private async void btnStart_Click(object sender, EventArgs e) { try { CreateDownloadFolders(); urls = new List<string>(); lblStatus.Text = "Downloading..."; rad.GetRadarImages(); await Task.Delay(5000); foreach (string link in rad.links) { urls.Add(link); } await sat.DownloadSatelliteAsync(); foreach (string link in sat.SatelliteUrls()) { urls.Add(link); } urlsCounter = urls.Count; await DownloadAsync(); } catch (Exception ex) { // 可自定义异常处理逻辑,比如弹框提示用户 MessageBox.Show($"操作失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); lblStatus.Text = "操作失败"; } }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

