在我的应用程序中,我想打开一个没有.txt扩展名的文本文件。有没有办法在.NET(C#)中获取.txt文件的标准应用程序?当然我可以使用“记事本”,但可能有些人(比如我),他们更喜欢另一个(他们的标准)编辑。
编辑:
注册表项“[HKEY_CLASSES_ROOT] \ txtfile \ shell \ open \ command”引用了记事本,但这不是我的txt文件的标准应用程序。如何获取我当前的.txt标准应用程序?
答案 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