2015-09-01 8 views
5

यहाँ कोड है कि मैं अपने अनुप्रयोग को बंद करने के लिए उपयोग करते हैं, इससे संबंधित प्रक्रियाओं और सभी फ़ाइलें आवेदन के उपयोग के दौरान निकाले दिया है को नष्ट करने के लिए है:प्रोग्रामिंग रूप से फ़ाइलों को कैसे हटाएं?

private void Quit_Click(object sender, RoutedEventArgs e) //close the application 
{ 
    //kill cinector after all import is done 
    Process[] processes = Process.GetProcesses(); 
    for (int i = 0; i < processes.Count(); i++) 
    { 
     if (processes[i].ProcessName.ToLower().Contains("CinectorProcess")) 
     { 
      processes[i].Kill(); 
     } 
    } 

    //also kill powerpoint just in case 

    for (int i = 0; i < processes.Count(); i++) 
    { 
     if (processes[i].ProcessName.ToLower().Contains("powerpnt")) 
     { 
      processes[i].Kill(); 
     } 
    } 

    //kill the engine 
    ShutdownEngine(); 

    //kill the main app 
    App.Current.Shutdown(); 

    //also delete all three folders 

    //slides_png_prev 
    if (Directory.Exists(slides_png_prev)) 
    { 
     Thumbnails = null; 
     Directory.Delete(slides_png_prev, true); 
    } 

    //slides_png 
    if (Directory.Exists(slides_png)) 
    { 
     Directory.Delete(slides_png, true); 
    } 

    //slides_png_prev_seleect 
    if (Directory.Exists(slides_png_prev_seleect)) 
    { 
     Directory.Delete(slides_png_prev_seleect, true); 
    } 
} 

हालांकि, समस्या यह है जब यह कोशिश करता है फ़ाइलों को हटाने के लिए (जो ऐप में कहीं भी इस्तेमाल की गई छवियां हैं) यह निम्नलिखित अपवाद दिखाता है:

"प्रक्रिया फ़ाइल तक नहीं पहुंच सकती क्योंकि यह किसी अन्य प्रक्रिया द्वारा उपयोग की जा रही है।"

अद्यतन: मैंने पाया कि प्रक्रिया 'Mastersolution.vhost.exe' सभी फाइलों कि मैं को हटाने का प्रयास कर रहा हूँ कर रहा है। मास्टर्सोल्यूशन वास्तव में मुख्य ऐप है जिसे मैं लाइन App.Current.Shutdown(); पर बंद कर रहा हूं इसलिए मुझे फ़ाइलों को हटाने से पहले मुख्य एप्लिकेशन से फाइलों को डिस्कनेक्ट करने की आवश्यकता है। लेकिन यह करने के लिए दुःख?

+4

यह Winforms/wpf/console अनुप्रयोग है? प्रक्रिया को मारना (एस) और गुई चीजों को करने का सबसे अच्छा तरीका प्रतीत नहीं होता .. – Sayse

+0

यह wpf है। गुई द्वारा मेरा मतलब है कि मुख्य आवेदन – Ivan

उत्तर

3

अपनी फ़ाइलों को एक temp निर्देशिका में संग्रहीत करें और ऑपरेटिंग सिस्टम को इसे संभालने दें।

Path.GetTempPath और Path.GetTempFileName देखें।

1

सबसे पहले आपको यह निर्धारित करना चाहिए कि फ़ोल्डर में कौन सी फ़ाइल लॉक है - पूरे फ़ोल्डर को हटाने के बजाय, अलग-अलग फ़ाइलों को हटाएं। फिर Process Explorer और Ctrl + F के साथ जांचें कि कौन सी प्रक्रिया वास्तव में अनावश्यक फ़ाइल का उपयोग करती है।

इसके अलावा आप इस कोड में WhoIsLocking विधि का उपयोग कर सकते हैं।

https://bitbucket.org/snippets/wiip/nnGX

आप इसका उपयोग यह निर्धारित करने के, जो प्रक्रिया फ़ाइल ताले कर सकते हैं। तो फिर आप इस प्रक्रिया को स्वचालित रूप से मारने के लिए कुछ इस तरह लिख सकते हैं:

  List<Process> lp = FileUtil.WhoIsLocking(fileName); 
     foreach (Process p in lp) 
     { 
       p.Kill(); 
     } 

यह आखिरी समाधान नहीं है जब वहाँ आदि में अपने ऐप्लिकेशन में फ़ाइल को बंद करने को बंद करने स्वचालन का उपयोग कर पावरपोइंट

+0

मैंने पाया कि प्रक्रिया 'Mastersolution.vhost.exe' उन सभी फ़ाइलों को पकड़ रही है जिन्हें मैं हटाने का प्रयास कर रहा हूं। मास्टर्सोल्यूशन वास्तव में मुख्य ऐप है जिसे मैं लाइन 'एप.क्यूरेंट' पर बंद कर रहा हूं।बंद करना();' – Ivan

+1

@Ivan जो वास्तव में इसका मतलब है कि आप फ़ाइल को बंद नहीं करते हैं, कहीं और आपके ऐप में फ़ाइल को सुरक्षित रूप से संभालती है। –

+0

अपने ऐप को डीबग करने का प्रयास करें और सुनिश्चित करें कि आप सभी खुली या बनाई गई फ़ाइलों को स्पष्ट रूप से बंद कर दें। यदि आपका आवेदन जटिल है, तो ऐसे टूल हैं जो आपकी मदद कर सकते हैं, जैसे http://www.jetbrains.com/profiler/index.html –

0

आप की तरह कोई बेहतर विकल्प हैं, बिना किसी समस्या के फ़ोल्डर्स को हटा सकते हैं बशर्ते वे उपयोग में न हों और आपको ऐसा करने की अनुमति है। आप यह निर्धारित करने के लिए SysInternals हैंडल का उपयोग कर सकते हैं कि कौन सी प्रक्रियाएं आपके द्वारा इच्छित फ़ाइल/फ़ोल्डर तक पहुंच रही हैं। ध्यान दें कि यदि आप फ़ाइलों को हटा नहीं सकते हैं और यह आपकी प्रक्रिया तक पहुंच नहीं है, तो बस एक चेतावनी उठाएं: "फ़ोल्डर को साफ़ नहीं किया जा सका: स्लाइड पूर्वावलोकन" जब तक आप एक पीएनजी को हटा नहीं सकते हैं तब तक उपयोगकर्ता ऐप्स को यादृच्छिक रूप से मारने के बजाय।

एक तरफ ध्यान दें: मुझे याद दिलाएं कि किसी ऐसे एप्लिकेशन का उपयोग न करें जो कार्यालय को मार सकता है और मैंने जो भी काम किया है उसे हटा दें।

आपको अभी तक शुरू या बेहतर प्रत्येक प्रक्रिया के पिड का उपयोग करना चाहिए, आईपीसी का उपयोग एक दोस्ताना शटडाउन अनुरोध भेजने के लिए करें जो बंद होने से पहले संसाधनों को साफ कर सके। पावरपॉइंट के लिए यह एप्लिकेशन ऑब्जेक्ट पर Quit() पर कॉल करने जैसा आसान है।

संबंधित मुद्दे