2017-07-23 139 views
0
private static string getPath(object id11) 
    { 
     string wmiQuery = string.Format("select CommandLine from Win32_Process where ProcessId={0}", id11); 
     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery)) 
     { 
      using (ManagementObjectCollection retObjectCollection = searcher.Get()) 
      { 
       foreach (ManagementObject retObject in retObjectCollection) 
       { 
        if (retObject["CommandLine"] != null) 
        { 
         string s= (string.Format("[{0}]", retObject["CommandLine"])); 
         string k = s.Substring(s.IndexOf("EXE")+4); 
         k = k.Remove(k.IndexOf("]")); 
         return k; 
        } 
        return null; 
       } 
       return null; 
      } 
     } 

我使用此代碼獲取記事本完整路徑。當記事本文件使用雙擊打開時,此代碼工作正常。但是,當我打開文件裏面的記事本像(文件 - >打開)...比這段代碼不工作得到一個完整的路徑。有沒有什麼方法可以找到像這樣打開文件的路徑。還有一件事我需要文件路徑不記事本可執行文件路徑。或者建議我一些其他解決方案。從C#中的進程獲取文件的完整路徑?

+2

因此,您正在尋找在另一個程序(如記事本)中使用該應用程序中的菜單打開的文檔的完整路徑?對我來說似乎是不可能的,因爲你需要知道內部工作情況,並且該信息需要被該應用程序公開。問題的標題有點讓人誤解,因爲你沒有在尋找過程的路徑。 –

+1

這聽起來像是一個XY問題。你有什麼使用情況,導致你想知道哪些文件在記事本中打開?你想解決什麼問題? – CodeCaster

+0

這用於回顧OLE的舊日,程序會發布他們用一個「moniker」打開的文件,這個文件是通過迭代Running Object Table找到的。 OLE死了,過期了​​,推開雛菊,去製造它的製造者,它是一隻死的鸚鵡。除非您知道有關該流程的很多*或者願意以某種方式進行合作,否則您無法開展此項工作。 –

回答

1

您的代碼查看發送到進程的命令行參數。正如你正確地發現的那樣,當你雙擊文件(.txt或.doc)時,它可能會作爲命令行參數發送到文件。在這些情況下,您的解決方案會正確找到該文件。

但是,當您從應用程序打開文件時,沒有命令行參數。

一種方法是使用像Handle這樣的工具來獲取打開文件的進程列表。

樣品屏幕截圖:

enter image description here

可以使用Process類來運行它,並解析輸出。

某些進程(如記事本)不會鎖定文件。所以,這個工具不會給你這些文件的名字。

+0

謝謝。其他可能的解決方案在這裏,我只提到記事本,但我需要爲所有應用程序工作,如(窗口照片查看器,vlc播放器...) –