3

我已经完成了我的程序,将其序列化以进行保存,并创建了一个文件打开系统来打开从我的应用程序中保存的文件。我什至在注册表上创建了一个与 innosetup 的文件关联,效果很好。

我现在想要实现的是,每当用户从程序中双击保存的文件时,程序都应该读取并反序列化它。

例如,当您双击或打开 .docx 或 .doc 文件时,会打开 Microsoft Word 并读取并打开该文件。目前我的程序将打开,但我不知道如何检测它何时从文件中打开,因此我可以开始反序列化。

注意:反序列化本身不是问题,它正在检测我是否应该这样做。

4

2 回答 2

1

当您通过双击关联文件启动程序时,文件名作为命令行参数传入。您指定此参数将在文件扩展名关联设置中出现的位置。

如果您将关联设置为:

程序.exe %1

双击您的文件将导致:

程序.exe C:\Folder\File.ext

这可以使用Environment.GetCommandLineArgs()或从您的Main(string[] args)方法访问:

static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            // Get the argument
            string fileLocation = args[0];

            // Load and deserialize
            // Do the do
        }
    }

这是关于命令行参数的 MSDN 文章

于 2013-07-25T13:29:57.933 回答
0

谢谢@Macropus,你实际上并没有告诉我我不知道什么,你指出了我的错误。当我在 innosetup 上设置注册表值时会发生这种情况

我写的不是{app}\program.exe %1innosetup,而是 "{app}\program.exe" "%1"

它忽略了打开程序的文件的路径。

所以当我查询Environment.GetCommandLineArgs();

仅返回 program.exe 的路径,但现在返回 program.exe 和调用该程序的文件的路径,可从Environment.GetCommandLineArgs()[1]

为了在我从快捷方式或 program.exe 本身打开文件时完成这项工作,我做了

var comArgs = Environment.GetCommandLineArgs();
if (comArgs.Length > 1)
{
    // Then I can deserialize here.
}

现在工作,谢谢大家。

于 2013-07-25T14:55:36.953 回答