2008-10-07 10 views
37

मैं सी # में प्रक्रिया आईडी द्वारा खुली फ़ाइल हैंडल की सूची कैसे प्राप्त करूं?सी # में प्रक्रिया द्वारा खुली फ़ाइल हैंडल की सूची कैसे प्राप्त करूं?

मुझे खोदने और फ़ाइल नामों को भी प्राप्त करने में दिलचस्पी है।

प्रोग्राम प्रोसेस एक्सप्लोरर के प्रोग्रामेटिक समकक्ष की तलाश में है।

सबसे अधिक संभावना है कि इसे इंटरऑप की आवश्यकता होगी।

इस पर एक बाउंटी जोड़ने पर विचार करना, कार्यान्वयन बहुत जटिल है।

+4

पूर्ण स्रोत कोड के साथ किसी भी अंतिम समाधान? – Kiquenet

उत्तर

22

ओच यह प्रबंधित कोड से करना कठिन होगा।

एक sample on codeproject

सामान के अधिकांश इंटरॉप में किया जा सकता है, लेकिन आप एक चालक की जरूरत है कारण यह कर्नेल के पता स्थान में रहता है फ़ाइल नाम पाने के लिए। प्रक्रिया एक्सप्लोरर ड्राइवर को अपने संसाधनों में एम्बेड करता है। यह सब सी # से जुड़ा हुआ है और 64 बिट के साथ-साथ 32 का समर्थन करता है, यह एक प्रमुख सिरदर्द होने जा रहा है।

+1

कौन कोड के बारे में परवाह करता है, वह बात उपयोगी है! प्रोसेस एक्सप्लोरर से भी बेहतर, यह क्या करता है। – Brian

+0

केवल प्रबंधित कोड का उपयोग कर अच्छा समाधान नहीं है? – Kiquenet

+0

यह ऐसा कुछ नहीं है जो प्रबंधित कोड में आसान है, मैं शायद सी ++ प्रोग्राम में बाहर निकलता हूं अगर मुझे इस तरह के कुछ @ kiquenet –

10

आप सभी हैंडल के लिए क्वेरी करने के लिए NtQuerySystemInformation फ़ंक्शन में P/INVOKE कर सकते हैं और फिर वहां से जा सकते हैं। यह Google groups discussion विवरण है।

+0

अच्छी चीजें। मैं देखता हूं कि क्या मैं इंटरपॉप –

+1

सी # में कोई नमूना कोड जा सकता हूं? – Kiquenet

12

आप मार्क Rusinovich द्वारा कमांड लाइन ऐप, Handle भी चला सकते हैं, और आउटपुट पार्स कर सकते हैं।

+0

सी # में पार्सिंग आउटपुट के लिए कोई नमूना कोड बनाना पड़ा था? – Kiquenet

+3

यह एक भयानक समाधान है। –

+2

क्यों @ ब्रूस? किसी भी कारण कृपया? – Kiquenet

2

हैंडल महान कार्यक्रम है, और कोडप्रोजेक्ट का लिंक अच्छा है।

@Brian कोड का कारण यह है कि handle.exe पुनर्वितरण योग्य नहीं है। न ही वे अपना स्रोत जारी करते हैं।

ऐसा लगता है कि .Net आसानी से ऐसा नहीं करेगा क्योंकि ऐसा लगता है कि जानकारी तक पहुंचने के लिए एक एम्बेडेड डिवाइस ड्राइव का पुनर्गठन किया जाता है। यह एक unmanged DLL के बिना .NET में नहीं किया जा सकता है। ठेठ .NET कोडिंग की तुलना में यह गहरा कर्नेल कोड है। मुझे आश्चर्य है कि डब्लूएमआई इसका पर्दाफाश नहीं करता है। खोला देखें/आपके सिस्टम में बंद फ़ाइलें (उल्लंघन के मुद्दों को बांटने)

http://www.nirsoft.net/utils/opened_files_view.html

+0

यह x64 संगत है। – ElektroStudios

1

शायद का उपयोग कर कमांड लाइन टूल

और उपयोग:

DetectOpenFiles.GetOpenFilesEnumerator(processID); 

डेमो:

using System; 
using System.Diagnostics; 

namespace OpenFiles 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id)) 
      { 
       while (openFiles.MoveNext()) 
       { 
        Console.WriteLine(openFiles.Current); 
       } 
      } 
      Console.WriteLine(); 
      Console.ReadKey(); 
     } 
    } 
} 

यह विधानसभा System.EnterpriseServices

6

इस फाइल पर एक नज़र डालें -

OpenedFilesView v1.50: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

+0

स्रोत कोड के साथ कोई पूर्ण नमूना ?? – Kiquenet

+0

आपके जैसा चल रहा है जैसे GetOpenFilesEnumerator 2 सदस्यों के साथ एक ऑब्जेक्ट देता है:
ERROR_ACCESS_DENIED और ERROR_INVALID_PARAMETERS – Lucian

+0

बस परीक्षण किया गया और यह कोड ठीक काम करता है। शायद आपके पास वास्तव में पहुंच नहीं है। – Mehran

1

से अधिक निर्भरता है wj32 के Process Hacker version 1 पर एक नज़र डालें, जो आप क्या पूछा क्या कर सकते हैं, और अधिक।

0

यह जांचने के लिए कि कोई फ़ाइल उपयोग में है (खुला) File Stream का उपयोग करें।

उदाहरण के लिए:

मान लें आप txtAttachPath.Text में संग्रहीत फ़ाइल पथ है और आप उस फ़ाइल को खोलने के लिए चाहते हैं, तो यह पहले से ही खुला नहीं है, आप अगर फ़ाइल खुला पहले तो इसे खोलने की जाँच करने की जरूरत है, यह है कि कैसे करना है:

जाँच करने के लिए एक विधि बनाने यदि फ़ाइल खुला है:

private bool attachedFileIsOpen(FileInfo file) 
{ 
    FileStream fs = null; 
    try 
    { 
     fs = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException ioe) 
    { 
    MessageBox.Show("The attachment file is already open!, can't open more than once!", "AMP Warning", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    return true; 
    } 
    finally 
    { 
     if (fs != null) fs.Close(); 
    } 
    return false; 
    } 

अगर फ़ाइल खुला है विधि की जाँच करें और उपयोगकर्ता के लिए संदेश है कि फाइल aleardy खुला है के साथ सच retrun होगा, अन्यथा यह झूठी वापसी करेगा (फाइल है बेकार)।

अगला विधि किसी भी घटना से चालू होने का उपयोग कर आप चुनते हैं:

FileInfo filePath = new FileInfo(txtAttachPath.Text); 
if (!txtAttachPath.Text.Equals("No Attachment") 
    && attachedFileIsOpen(filePath) == false 
    && processIsRunning("notepad") == false) 
{ 
    Process openFilebyExtension = Process.Start(txtAttachPath.Text); 
      openFilebyExtension.WaitForInputIdle(); 
      NativeWindow.FromHandle(this.Handle); 
} 

नोट कुछ बिल्ट-इन खिड़कियों कार्यक्रमों नोटपैड की अनुमति देता है की तरह एक ही फाइल के कई उदाहरण खोले जाने के लिए, इस प्रकार का पता नहीं किया जा सकता है File Stream विधि द्वारा, इसके लिए अन्य समाधान यह पता लगाने के लिए है कि प्रक्रिया चल रही है या नहीं।

आप फ़ाइल प्रकार खोलने का प्रयास कर रहे हैं के साथ जुड़े प्रक्रिया चलाने के लिए जाँच करने के लिए एक और तरीका जोड़ने की आवश्यकता होगी:

private bool processIsRunning(string process) 
     { 
      Process[] runningProcesses = Process.GetProcessesByName(process); 
      bool processIsRunning = false; 
      if(runningProcesses.Length == 0) 
      { 
       processIsRunning = false; 
      } 
      else 
      { 
       processIsRunning = true; 
       MessageBox.Show("The attachment file is already open!, can't open more than once!", "AMP Warning", 
        MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      return processIsRunning; 
     } 
संबंधित मुद्दे