获取txt文件的标准应用程序(.NET)

时间:2011-02-18 23:02:31

标签: c# .net windows process

在我的应用程序中,我想打开一个没有.txt扩展名的文本文件。有没有办法在.NET(C#)中获取.txt文件的标准应用程序?当然我可以使用“记事本”,但可能有些人(比如我),他们更喜欢另一个(他们的标准)编辑。


编辑:

注册表项“[HKEY_CLASSES_ROOT] \ txtfile \ shell \ open \ command”引用了记事本,但这不是我的txt文件的标准应用程序。如何获取我当前的.txt标准应用程序?

4 个答案:

答案 0 :(得分:4)

绝对最佳选择是使用ShellExecuteEx,传递SEE_MASK_CLASSNAME标记,以打开此文件,就像它是".txt"一样。这是支持基于DDE和基于拖放的文件打开机制等方法的唯一方法。

但是如果你想自己做(例如以部分信任方式运行而不能调用ShellExecuteEx),请按以下步骤操作:

还有另一层次的间接。你首先要查找

  

HKCR \ .TXT

从该键中读取默认值,将其命名为 txtkey

然后检查

  

HKCR \ txtkey \ shell \ open \ command

还有一项功能可以为您执行此操作:AssocQueryString

答案 1 :(得分:1)

据我所知,您必须通过P / Invoke访问它,但最简洁的方法可能是创建一个包含您关注的扩展名的临时文件,并为临时文件调用FindExecutable。然后,您可以使用该可执行文件打开您关注的文件。

答案 2 :(得分:1)

我的代码包含一些检查以防止出现一些常见错误...希望有所帮助: - )

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace HQ.Util.Unmanaged
{
    /// <summary>
    /// Usage:  string executablePath = FileAssociation.GetExecFileAssociatedToExtension(pathExtension, "open");
    /// </summary>
    public static class FileAssociation
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="ext"></param>
        /// <param name="verb"></param>
        /// <returns>Return null if not found</returns>
        public static string GetExecFileAssociatedToExtension(string ext, string verb = null)
        {
            if (ext[0] != '.')
            {
                ext = "." + ext;
            }

            string executablePath = FileExtentionInfo(AssocStr.Executable, ext, verb); // Will only work for 'open' verb
            if (string.IsNullOrEmpty(executablePath))
            {
                executablePath = FileExtentionInfo(AssocStr.Command, ext, verb); // required to find command of any other verb than 'open'

                // Extract only the path
                if (!string.IsNullOrEmpty(executablePath) && executablePath.Length > 1) 
                {
                    if (executablePath[0] == '"')
                    {
                        executablePath = executablePath.Split('\"')[1];
                    }
                    else if (executablePath[0] == '\'')
                    {
                        executablePath = executablePath.Split('\'')[1];
                    }
                }
            }

            // Ensure to not return the default OpenWith.exe associated executable in Windows 8 or higher
            if (!string.IsNullOrEmpty(executablePath) && File.Exists(executablePath) &&
                !executablePath.ToLower().EndsWith(".dll"))
            {
                if (executablePath.ToLower().EndsWith("openwith.exe"))
                {
                    return null; // 'OpenWith.exe' is th windows 8 or higher default for unknown extensions. I don't want to have it as associted file
                }
                return executablePath;
            }
            return executablePath;
        }

        [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] StringBuilder pszOut, [In][Out] ref uint pcchOut);

        private static string FileExtentionInfo(AssocStr assocStr, string doctype, string verb)
        {
            uint pcchOut = 0;
            AssocQueryString(AssocF.Verify, assocStr, doctype, verb, null, ref pcchOut);

            Debug.Assert(pcchOut != 0);
            if (pcchOut == 0)
            {
                return "";
            }

            StringBuilder pszOut = new StringBuilder((int)pcchOut);
            AssocQueryString(AssocF.Verify, assocStr, doctype, verb, pszOut, ref pcchOut);
            return pszOut.ToString();
        }

        [Flags]
        public enum AssocF
        {
            Init_NoRemapCLSID = 0x1,
            Init_ByExeName = 0x2,
            Open_ByExeName = 0x2,
            Init_DefaultToStar = 0x4,
            Init_DefaultToFolder = 0x8,
            NoUserSettings = 0x10,
            NoTruncate = 0x20,
            Verify = 0x40,
            RemapRunDll = 0x80,
            NoFixUps = 0x100,
            IgnoreBaseClass = 0x200
        }

        public enum AssocStr
        {
            Command = 1,
            Executable,
            FriendlyDocName,
            FriendlyAppName,
            NoOpen,
            ShellNewValue,
            DDECommand,
            DDEIfExec,
            DDEApplication,
            DDETopic
        }



    }
}

答案 3 :(得分:0)

尝试直接打开.txt文件。

Process.Start("MyFile.txt");

它应该使用首选文本编辑器自动打开。

修改

哎呀,没看到它没有.txt扩展名。可能必须在注册表中检查首选编辑器?

修改

它在我的电脑上(Windows 7):HKEY_CLASSES_ROOT \ textfile \ shell \ open \ command