如何使 c# 控制台应用程序 .exe 打开保存对话框以保存应用程序生成的文件?

Posted

技术标签:

【中文标题】如何使 c# 控制台应用程序 .exe 打开保存对话框以保存应用程序生成的文件?【英文标题】:How to make a c# console app .exe to open a save dialog to save a file generated by the app? 【发布时间】:2021-08-22 11:07:18 【问题描述】:

我的代码:

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;
                    
                
            
       
            File.WriteAllText("./MOCK_DATA_SORTED.json",JsonConvert.SerializeObject(datas, Formatting.Indented));   
        

当我运行.exe 时,显然我无法将新文件MOCK_DATA_SORTED.json 保存在我想要的位置。

救命!

【问题讨论】:

这能回答你的问题吗? IS it possible to have savefiledialog () in windows console applications 你的答案,在 Visual Studio 中,当我点击添加参考时,如何找到 System.Windows.Forms ? 这能回答你的问题吗? Can't use System.Windows.Forms 和 how to add System.Windows.Forms in visual studio 2010 和 Add reference of System.Windows.forms in .Net Core 对于控制台应用程序,您通常通过命令行(即args)传递此类设置,而不是提供 UI。 全部,我不确定“通过命令行”是否理解,我的目的是当用户单击 .exe 文件(我编译的控制台应用程序)时,会打开一个保存对话框以便保存文件输出。 【参考方案1】:

真的想在控制台应用程序中显示“另存为”对话框吗?如果是这样,请查看有关问题的 cmets,了解如何从控制台应用程序引用 System.Windows.Forms 程序集,并将 using 指令添加到 System.Windows.Forms 到您的 Program 类。我觉得有点不对劲,如果您想要一个打开对话框的应用程序,那么创建 Windows 窗体或 WPF 应用程序比创建控制台应用程序更容易。但我该评判谁?

但是,如果您想要一个控制台应用程序,并且您希望运行该应用程序的人在他们运行该应用程序时决定将输出文件保存在哪里,我会建议两种方法。

命令行参数

首先,扩展Klaus Gutter's comment 关于使用命令行参数。

在方法签名中

public static void Main(string[] args)

该参数args 表示传递给您的应用程序的所有命令行参数。例如,假设您的应用程序可执行文件名为 MyApp.exe,并且您从命令行调用它:

MyApp first second "third fourth fifth" sixth

那么args将是一个有4个元素的数组,每个元素都是一个字符串,具有以下值

first
second
third fourth fifth
sixth

(请注意命令行中如何将“第三第四第五”括在引号中,这会导致 3 个单独的单词作为数组的单个元素而不是 3 个不同的元素传递,如果您的参数包含空格,这很有用.)

因此,对于您希望用户在运行时指定目标路径的用例,请考虑以下程序:

namespace ***68880709ConsoleAppArgs

    using System;
    using System.IO;

    public class Program
    
        public static void Main(string[] args)
        
            if (args.Length < 1)
            
                Console.WriteLine(@"Usage: MyApp C:\Temp");
                return; // or you could throw an exception here
            

            var destinationFolder = args[0];
            if (!Directory.Exists(destinationFolder))
            
                Console.WriteLine("Destination folder " + destinationFolder + " doesn't exist");
                return; // or you could throw an exception here
            

            var data = "stuff to write to the file"; // put your logic to create the data here

            var destinationPath = Path.Combine(destinationFolder, "MOCK_DATA_SORTED.json");
            File.WriteAllText(destinationPath, data);
        
    

假设您的应用程序仍编译为名为 MyApp.exe 的可执行文件,您可以像这样从命令提示符运行它

MyApp C:\SomewhereIWantToSaveTheFile

MyApp "C:\Some folder with spaces in the name"

接受来自控制台的输入

如果您不希望您的用户必须处理命令提示并导航到 .exe 的部署位置,并且您希望他们能够通过在文件资源管理器中双击应用程序来启动它,您可以改用这种方法:

namespace ***68880709ConsoleAppArgs

    using System;
    using System.IO;

    public class Program
    
        public static void Main(string[] args)
        
            Console.WriteLine("Please enter destination folder");
            var destinationFolder = Console.ReadLine();

            if (!Directory.Exists(destinationFolder))
            
                Console.WriteLine("Destination folder " + destinationFolder + " doesn't exist");
                return; // or you could loop back and prompt the user again
            

            var data = "stuff to write to the file"; // put your logic to create the data here

            var destinationPath = Path.Combine(destinationFolder, "MOCK_DATA_SORTED.json");
            File.WriteAllText(destinationPath, data);
        
    

此版本允许用户通过双击启动应用程序,并在控制台窗口中提示他们输入应保存输出文件的文件夹的路径。

结论

我已经向您展示了两种在运行时将信息传递到控制台应用程序的非常常见的方法,希望您会发现它们很有用。如果您既是该应用程序的用户又是其开发者,那么您也应该能够以这两种方式中的任何一种方式运行它。

但是,如果应用程序的用户是其他一些人,他们坚持认为他们需要某种“另存为”对话框来浏览到目标文件夹,那么只要您从 Windows 窗体等 UI 框架中引入该对话框或 WPF,您不妨围绕该框架构建您的应用程序,而不是使其成为控制台应用程序。

控制台应用程序非常适合非交互式批处理,它们非常适合技术熟练的用户社区(想想开发人员、服务器管理员等),但它们不适合使用的非技术用户通过单击和拖放来完成所有操作。

欢迎来到 Stack Overflow BTW :-)

【讨论】:

哇,谢谢您的时间和解释 sbridewell !这是我在 *** 上的第一个问题,非常感谢。 我只想补充一点,您的解释非常有教育意义,通过简单地告诉我如何做以及为什么它不是更好的方法。 ty @Mulholland 谢谢,不客气。如果您发现此答案有帮助,请考虑接受和/或投票 - ***.com/help/someone-answers

以上是关于如何使 c# 控制台应用程序 .exe 打开保存对话框以保存应用程序生成的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的 C# Basic 控制台应用程序打包成一个 EXE 文件? [复制]

如何打开 2+ 个 VLC 实例并以编程方式控制它们?

如何将 C# 控制台应用程序部署为单个 exe? [复制]

无法保存对spoolsv.exe权限所作的更改

C# - Windows 窗体应用程序 - 保存文件

如何将 .exe 从 C++ 项目复制到 C# 项目的输出目录?