C#如何保存程序以打开文件?

时间:2011-12-22 11:09:00

标签: c# file-io

在我们的应用程序中单击按钮时,它会将文件从服务器下载到客户端并打开它以供用户查看。我们允许用户选择要打开该文件的应用程序,但标准框提供“始终使用所选程序打开此类文件”选项。不幸的是,勾选这个没有区别,并且.rtf文件默认下次再次在Word中打开。

我们如何才能正确存储和检索此设置?

我们用来显示此窗口的代码如下:

//Ask the user what application they want to open the file in.
if (strFileName != "" && File.Exists(strFileName))
{
    // Call Windows "Open With" dialog
    CoreUtilities.ShowOpenFileDialog(strFileName);
}

非常感谢

科林

3 个答案:

答案 0 :(得分:0)

这是一个代码片段,用于调用Windows的 Open with ... 对话框,

除非CoreUtilities.ShowOpenFileDialog已经使用这种方法实现,否则你应该给它一个命中:

[Serializable]
public struct ShellExecuteInfo
{
    public int Size;
    public uint Mask;
    public IntPtr hwnd;
    public string Verb;
    public string File;
    public string Parameters;
    public string Directory;
    public uint Show;
    public IntPtr InstApp;
    public IntPtr IDList;
    public string Class;
    public IntPtr hkeyClass;
    public uint HotKey;
    public IntPtr Icon;
    public IntPtr Monitor;
}

// Code For OpenWithDialog Box

[DllImport("shell32.dll", SetLastError = true)]
extern public static bool 
       ShellExecuteEx(ref ShellExecuteInfo lpExecInfo);

public const uint SW_NORMAL = 1;

static void OpenAs(string file)
{
    ShellExecuteInfo sei = new ShellExecuteInfo();
    sei.Size = Marshal.SizeOf(sei);
    sei.Verb = "openas";
    sei.File = file;
    sei.Show = SW_NORMAL;
    if (!ShellExecuteEx(ref sei))
        throw new System.ComponentModel.Win32Exception();
}

答案 1 :(得分:0)

有一个肮脏的黑客,但我不知道你是否会喜欢它:) 您可以在每次调用CoreUtilities.ShowOpenFileDialog()之前删除注册表中存储的assoc。 这是注册表中的路径

  

HKEY_CURRENT_USER /软件/微软/在Windows / CURRENTVERSION /浏览器/ FileExts

或者您可以尝试运行

System.Diagnostics.Process.Start(path);

这将始终使用默认程序。或者在需要时显示打开对话框(当没有关联的默认程序时)

答案 2 :(得分:-1)

您是否尝试使用“打开”动词打开文件?

    public static void displayLabel(string labelFileName)
    {
        System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(labelFileName);
        info.UseShellExecute = true;
        info.Verb = "open";
        System.Diagnostics.Process.Start(info);
    }

我使用上面的代码打开文件。它将使用您为给定扩展分配的默认应用程序打开该文件。例如,如果使用.pdf文件名调用,它将在Acrobat中打开,就像传入.txt一样,它将在记事本中打开。