如何让C#控制台应用.exe弹出保存对话框,存储程序生成的文件?
你当前代码将输出文件的保存路径硬编码为相对路径./MOCK_DATA_SORTED.json,程序默认会输出到exe运行的工作目录下,无法自定义存储位置。以下是几种可行的修改方案:
注意:所有方案用到的路径操作类需要引用
System.IO命名空间,编译报错可先确认是否添加了对应using语句。
方案1:通过命令行参数传递保存路径(推荐,适合控制台程序)
可以直接将目标路径作为启动参数传给exe,支持直接拖拽文件夹/文件到exe图标上快速传入路径,修改后的代码如下:
static void Main(string[] args) { string filePath = "./MOCK_DATA.json"; List<UserModel> datas = JsonConvert.DeserializeObject<List<UserModel>>(File.ReadAllText(filePath)); int count = datas.Count; for (var i = 0; i < count - 1; i++) { for (var j = 0; j < count - 1 - i; j++) { if (String.Compare(datas[j].VIN, datas[j + 1].VIN) > 0) { UserModel temp = datas[j + 1]; datas[j + 1] = datas[j]; datas[j] = temp; } } } // 处理输出路径 string outputPath; if (args.Length > 0 && !string.IsNullOrWhiteSpace(args[0])) { // 如果传入的是目录,自动拼接默认文件名 if (Directory.Exists(args[0])) { outputPath = Path.Combine(args[0], "MOCK_DATA_SORTED.json"); } else { // 传入的是完整文件路径直接使用 outputPath = args[0]; } } else { // 没有传参数用默认路径 outputPath = "./MOCK_DATA_SORTED.json"; } // 确保输出目录存在 Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); File.WriteAllText(outputPath, JsonConvert.SerializeObject(datas, Formatting.Indented)); }
使用方法:你可以直接选中想要保存的文件夹,按住鼠标拖拽到exe文件图标上松开,程序就会把排序后的文件输出到你拖拽的文件夹里。也可以在cmd/powershell中运行时带上路径参数,比如./你的程序名.exe D:\我的数据\排序后的数据.json
方案2:运行时交互输入保存路径
启动程序后提示用户输入存储位置,适合手动运行时自定义,修改代码如下:
static void Main(string[] args) { string filePath = "./MOCK_DATA.json"; List<UserModel> datas = JsonConvert.DeserializeObject<List<UserModel>>(File.ReadAllText(filePath)); int count = datas.Count; for (var i = 0; i < count - 1; i++) { for (var j = 0; j < count - 1 - i; j++) { if (String.Compare(datas[j].VIN, datas[j + 1].VIN) > 0) { UserModel temp = datas[j + 1]; datas[j + 1] = datas[j]; datas[j] = temp; } } } Console.WriteLine("请输入输出文件的保存路径(直接回车则默认保存在程序同级目录):"); string inputPath = Console.ReadLine()?.Trim() ?? ""; string outputPath; if (!string.IsNullOrWhiteSpace(inputPath)) { if (Directory.Exists(inputPath)) { outputPath = Path.Combine(inputPath, "MOCK_DATA_SORTED.json"); } else { outputPath = inputPath; } } else { outputPath = "./MOCK_DATA_SORTED.json"; } Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); File.WriteAllText(outputPath, JsonConvert.SerializeObject(datas, Formatting.Indented)); Console.WriteLine($"文件已保存到:{Path.GetFullPath(outputPath)}"); }
可选:弹出图形化文件选择对话框
如果需要更直观的窗口选择保存位置,需要给项目添加System.Windows.Forms引用,然后在代码中加入保存对话框逻辑:
using System.Windows.Forms; // 排序逻辑省略,和原有逻辑一致 SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Filter = "JSON文件(*.json)|*.json|所有文件(*.*)|*.*"; saveDialog.FileName = "MOCK_DATA_SORTED.json"; if (saveDialog.ShowDialog() == DialogResult.OK) { File.WriteAllText(saveDialog.FileName, JsonConvert.SerializeObject(datas, Formatting.Indented)); }
注意:要在项目属性里把输出类型改成「Windows 应用程序」才不会额外弹出控制台黑框,如果保留控制台类型也可以正常使用该功能。
内容的提问来源于stack exchange,提问作者Mulholland
相关产品推荐
相关产品推荐

