2014-12-03 44 views
0

默認值中獲取應用程序名稱我需要知道最有效的方式從註冊表/ LocalMachine/Software/Classes/.docx/shell/Open/Command。例如,從這個我如何從註冊表/本地機器/軟件/類/ .docx/shell /打開/命令

「C:\ Program Files文件(x86)的\的Microsoft Office \ Office15 \ POWERPNT.EXE」 「%1」/ OU 「%U」

我將只需要「POWERPNT.EXE 」。子字符串和替換不是有效的,因爲裏面的值顯示不同。例如

「C:\ Program Files文件(x86)的\的Microsoft Office \ Office15 \ EXCEL.EXE」/ DDE

「C:\ Program Files文件(x86)的\ Skype的\電話\ Skype.exe的」「/uri:%l「

我在這裏遇到的真正問題是,我正在檢索的字符串可能包含命令行參數以及子字符串和替換字符串的可執行文件的路徑瞭解更多。

我的方法的目的是要找出所述程序被用於打開相關聯的文件類型,然後使用的Process.Start(「EXCEL.EXE」,fileURL)來打開從SharePoint DocumentLibrary

+0

你問如何讀取註冊表,或如何解析讀取它返回的路徑? – 2014-12-03 03:21:05

+0

我現在可以讀取註冊表和它裏面的值。我的問題是當我從鍵中得到的值,我如何才能得到只有.exe部分才能得到EXCEL.EXE,Skype.exe等我的方法的意圖是找出正在使用的程序來打開關聯文件類型,然後使用Process.Start(「EXCEL.EXE」,fileURL)打開文件 – user1166085 2014-12-03 03:25:49

+0

因此,如果您已經可以讀取註冊表,那麼您的問題是:「如何從完整的文件路徑獲取文件名?」。或者是其他東西? – 2014-12-03 03:29:29

回答

1

會這樣的工作?

public static string GetFileName(string input) 
{ 
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase); 
    if (extensionIndex < 0) return string.Empty; 
    return Path.GetFileName(input.Replace("\"", "").Substring(0, extensionIndex + 4)); 
} 

// Or, if you want to get the full path: 
public static string GetFilePath(string input) 
{ 
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase); 
    if (extensionIndex < 0) return string.Empty; 
    return input.Replace("\"", "").Substring(0, extensionIndex + 4); 
} 

用法:

string regValue = 
    "C:\\Program Files (x86)\\Microsoft Office\\Office15\\EXCEL.EXE /dde"; 

Console.WriteLine(GetFileName(regValue)); 
Console.WriteLine(GetFilePath(regValue)); 
// Output: 
// EXCEL.EXE 
// C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE 

regValue = "\"C:\\Program Files (x86)\\Skype\\Phone\\Skype.exe\" \"/uri:%l\""; 

Console.WriteLine(GetFileName(regValue)); 
Console.WriteLine(GetFilePath(regValue)); 
// Output: 
// Skype.exe 
// C:\Program Files (x86)\Skype\Phone\Skype.exe 
+0

已更新,其中包含獲取完整路徑的解決方案。 – 2014-12-03 04:09:42

+0

嗨!目前這似乎對我有用。正在測試各種嘗試不同的擴展,這似乎工作得很好。哦!除了你的方法會在「Skype.exe」之後留下一個空格,這很容易通過使用Replace來解決。非常感謝! :) – user1166085 2014-12-03 06:18:32

0

一個文件在幾乎所有情況下,CommandLineToArgvW應該很好地工作。它返回一個字符串數組,其第一個元素是可執行文件的路徑。

然後,您只需刪除引號(如果有)和所有內容直到最後一個反斜槓。

可能(或可能不)是病理性病例,其中該函數不像Explorer那樣解釋字符串。我認爲除了通過實驗以外,沒有其他辦法可以確定這一點。

+0

這是C++,而不是C# – 2014-12-03 03:27:15

+0

@RufusL:你可以P /調用它,當然?好的,如果有一個相當於.NET的版本,那會更好,但我不知道它存在。 – 2014-12-03 03:29:22

+0

另一種方法是在C運行時庫中查找解析命令行並將其移植到C#的代碼。 (同樣,不一定完全相同,請介意你。) – 2014-12-03 03:58:26

0

初始問題的意見明確了實際問題。

我的方法的目的是要找出被用來 程序打開關聯的文件類型,然後使用 的Process.Start(「EXCEL.EXE」,fileURL)來打開文件

如果您只需要在相關應用程序中打開給定文件,則無需讀取註冊表或解析命令行。

您可以通過調用一個參數爲Process.Start的不同超載來打開文件。

Process.Start(fileURL); 

根據MSDN:http://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx,參數是名稱的文件或應用程序文件在進程中運行。

我測試了兩個本地文件,如「C:\ folder \ test.txt」和URL。

Process.Start(@"C:\folder\test.txt"); // Opens test.txt in Notepad 

Process.Start("http://regmagik.com/index.htm"); // Opens web page in the browser 
+0

它只會打開本地文件,但是如果你放入一個url,它會繼續下載文件。 :( – user1166085 2014-12-03 04:05:53

+0

您能否提供您想要打開的示例文件URL? – regmagik 2014-12-03 04:36:10

+0

http://intranet.*****.com/***/*****/check%20in%20library/checkin% 20library.docx – user1166085 2014-12-03 05:45:41