दिलचस्प पोस्ट
एस्पनेट एमवीसी 2 – एक मॉडल की संपत्ति को एक अलग नामांकित मान से बाँधें सरणी में सर्वोच्च मूल्य का सूचकांक लौटें "बराबर नहीं" ऑपरेटरों के बीच अंतर <> और! = PHP में कस्टम प्राधिकृत विशेषता .gitignore फ़ोल्डर को बहिष्कृत करते हैं लेकिन विशिष्ट सबफ़ोल्डर शामिल करते हैं अजगर का समर्थन करता है multithreading? क्या यह निष्पादन समय गति कर सकता है? स्ट्रिंग स्ट्रिंग और स्ट्रिंग स्ट्रेटल के बीच अंतर क्या है? दिनांक के बीच एसक्यूएल चुनें क्या "const" का मतलब सिर्फ पढ़ने-योग्य या कुछ और है? अच्छी तरह से, स्टड :: अनूठे_पीटआर का कस्टम डिलर कैसे काम करता है? एक शांत सेवा में आंशिक अपडेट के लिए सर्वश्रेष्ठ अभ्यास Html.fromHtml एंड्रॉइड एन में पदावनत हुआ सी में घोषित, अपरिष्कृत वैरिएबल का क्या होता है? क्या इसका मूल्य है? यह निर्धारित करने के लिए कि क्या मेरी गतिविधियों में से एक अग्रभूमि में है JQuery UI स्वत: पूर्ण में "mustMatch" और "selectFirst" कैसे कार्यान्वित करें?

सी #: चलाने की प्रक्रिया का पूरा रास्ता कैसे प्राप्त करें?

मुझे एक ऐसा आवेदन मिल रहा है जो अन्य एप्लिकेशन की कुछ सेटिंग्स बदल रहा है (यह एक साधारण सी # एप्लिकेशन है जो डबल क्लिक करके चलाता है (कोई सेटअप आवश्यक नहीं है))।

सेटिंग्स को बदलने के बाद मुझे दूसरे एप्लिकेशन को पुनरारंभ करने की आवश्यकता है ताकि यह परिवर्तित सेटिंग्स को प्रदर्शित करे।

ऐसा करने के लिए, मुझे चलने की प्रक्रिया को मारना पड़ता है और फिर से प्रक्रिया शुरू करनी पड़ती है, लेकिन समस्या यह है कि हत्या के बाद मैं इस प्रक्रिया को नहीं खोज पा रहा हूं। (कारण प्रणाली नहीं है, जहां exe फ़ाइल है ..)

क्या चलने की प्रक्रिया या एक्सई के पथ को जानने का कोई तरीका है, यदि वह चल रहा है?

मैं मैन्युअल रूप से पथ नहीं देना चाहता, यानी अगर यह पथ चला रहा है, तो प्रक्रिया को मार डालो और फिर से शुरू करें …. मैं बाद में संभालूँगा

वेब के समाधान से एकत्रित समाधान "सी #: चलाने की प्रक्रिया का पूरा रास्ता कैसे प्राप्त करें?"

using System.Diagnostics; var process = Process.GetCurrentProcess(); // Or whatever method you are using string fullPath = process.MainModule.FileName; //fullPath has the path to exe. 

इस एपीआई के साथ एक कैच है, यदि आप 32 बिट अनुप्रयोग में इस कोड को चला रहे हैं, तो आप 64-बिट अनुप्रयोग पथ तक पहुंचने में सक्षम नहीं होंगे, इसलिए आप को 64-बिट अनुप्रयोग के रूप में आप को संकलन और चलाने के लिए आवेदन करना होगा। (प्रोजेक्ट गुण -> बिल्ड -> प्लेटफ़ॉर्म लक्ष्य -> ​​x64)

आप क्या कर सकते हैं पथ प्राप्त करने के लिए WMI का उपयोग करें। यह आपको 32-बिट या 64-बिट अनुप्रयोग के बावजूद पथ प्राप्त करने की अनुमति देगा। यह दर्शाते हुए एक उदाहरण है कि आप इसे कैसे प्राप्त कर सकते हैं:

 // include the namespace using System.Management; var wmiQueryString = "SELECT ProcessId, ExecutablePath, CommandLine FROM Win32_Process"; using (var searcher = new ManagementObjectSearcher(wmiQueryString)) using (var results = searcher.Get()) { var query = from p in Process.GetProcesses() join mo in results.Cast<ManagementObject>() on p.Id equals (int)(uint)mo["ProcessId"] select new { Process = p, Path = (string)mo["ExecutablePath"], CommandLine = (string)mo["CommandLine"], }; foreach (var item in query) { // Do what you want with the Process, Path, and CommandLine } } 

ध्यान दें कि आपको System.Management.dllSystem.Management.dll असेंबली को संदर्भित करना होगा और System.Management.dll का उपयोग करना System.Management नामस्थान

प्रोग्राम ( CommandLine ) को शुरू करने के लिए उपयोग की जाने वाली कमांड लाइन जैसे अन्य प्रक्रियाओं के बारे में अधिक जानकारी के लिए, अधिक जानकारी के लिए Win32_Process वर्ग और WMI .NET देखें।

मेरा अनुमान है कि आपके पास पहले से चलने वाली प्रक्रिया की प्रक्रिया वस्तु है (उदाहरण के लिए GetProcessesByName ()) तब आप उपयोग कर निष्पादन योग्य फ़ाइल नाम प्राप्त कर सकते हैं

 Process p; string filename = p.MainModule.FileName; 

संजीवकुमार हिरेमाथ और जेफ मर्कडो के उत्तर का संयोजन करके आप वास्तव में एक तरह से समस्या को हल कर सकते हैं जब एक 32-बिट प्रक्रिया में 64-बिट प्रक्रिया से आइकन को पुनर्प्राप्त करते हैं

 using System; using System.Management; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int processID = 6680; // Change for the process you would like to use Process process = Process.GetProcessById(processID); string path = ProcessExecutablePath(process); } static private string ProcessExecutablePath(Process process) { try { return process.MainModule.FileName; } catch { string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject item in searcher.Get()) { object id = item["ProcessID"]; object path = item["ExecutablePath"]; if (path != null && id.ToString() == process.Id.ToString()) { return path.ToString(); } } } return ""; } } } 

यह थोड़ा धीमा हो सकता है और हर प्रक्रिया में काम नहीं करता है जिसमें "मान्य" आइकन नहीं होता है

यहां एक विश्वसनीय समाधान है, जो कि 32 बिट और 64 बिट दोनों एप्लीकेशनों के साथ काम करता है।

इन संदर्भों को जोड़ें:

सिस्टम। डायग्नोस्टिक्स का उपयोग कर;

System.Management का उपयोग कर;

अपनी प्रोजेक्ट में इस विधि को जोड़ें:

 public static string GetProcessPath(int processId) { string MethodResult = ""; try { string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId; using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query)) { using (ManagementObjectCollection moc = mos.Get()) { string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString(); MethodResult = ExecutablePath; } } } catch //(Exception ex) { //ex.HandleException(); } return MethodResult; } 

अब इसका उपयोग इसी तरह करें:

 int RootProcessId = Process.GetCurrentProcess().Id; GetProcessPath(RootProcessId); 

ध्यान दें कि यदि आप प्रक्रिया का आईडी जानते हैं, तो यह विधि संबंधित ExecutePath को वापस करेगा

अतिरिक्त, रुचि रखने वालों के लिए:

 Process.GetProcesses() 

… आपको वर्तमान में चलने वाली सभी प्रक्रियाओं की एक सरणी प्रदान करेगा, और …

 Process.GetCurrentProcess() 

… आपको वर्तमान जानकारी देगी, साथ ही उनकी जानकारी जैसे आईडी, आदि और सीमित नियंत्रण जैसे किल, आदि *

प्रयत्न:

 using System.Diagnostics; ProcessModuleCollection modules = Process.GetCurrentProcess().Modules; string processpathfilename; string processmodulename; if (modules.Count > 0) { processpathfilename = modules[0].FileName; processmodulename= modules[0].ModuleName; } else { throw new ExecutionEngineException("Something critical occurred with the running process."); } 
 using System; using System.Diagnostics; class Program { public static void printAllprocesses() { Process[] processlist = Process.GetProcesses(); foreach (Process process in processlist) { try { String fileName = process.MainModule.FileName; String processName = process.ProcessName; Console.WriteLine("processName : {0}, fileName : {1}", processName, fileName); }catch(Exception e) { /* You will get access denied exception for system processes, We are skiping the system processes here */ } } } static void Main() { printAllprocesses(); } } 

आप pInvoke और एक देशी कॉल का उपयोग कर सकते हैं जैसे निम्न। यह 32/64 बिट सीमा नहीं है (कम से कम मेरे परीक्षण में)

यहां कोड है

 using System.Runtime.InteropServices; [DllImport("Kernel32.dll")] static extern uint QueryFullProcessImageName(IntPtr hProcess, uint flags, StringBuilder text, out uint size); //Get the path to a process //proc = the process desired private string GetPathToApp (Process proc) { string pathToExe = string.Empty; if (null != proc) { uint nChars = 256; StringBuilder Buff = new StringBuilder((int)nChars); uint success = QueryFullProcessImageName(proc.Handle, 0, Buff, out nChars); if (0 != success) { pathToExe = Buff.ToString(); } else { int error = Marshal.GetLastWin32Error(); pathToExe = ("Error = " + error + " when calling GetProcessImageFileName"); } } return pathToExe; } 

Process वर्ग के सदस्य StartInfo जिसे आपको जांचना चाहिए:

 private void Test_Click(object sender, System.EventArgs e){ string path; path = System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase ); Console.WriiteLine( path ); } 

निष्पादन प्रक्रिया की वर्तमान निर्देशिका की तलाश करते समय मुझे इस सूत्र के पास मिला। 1.1 में माइक्रोसॉफ्ट ने शुरू किया:

 Directory.GetCurrentDirectory(); 

अच्छी तरह से काम करने लगता है (लेकिन इस प्रक्रिया का नाम वापस नहीं लौटाता)