2010-07-24 16 views
5


द्वारा किया जा रहा है मैं जो इसे अन्य प्रक्रियाएक फ़ाइल जबरदस्ती हटाया जा रहा है, भले ही यह अन्य प्रक्रिया

द्वारा किया जा रहा है निम्नलिखित स्निपेट पर विचार करें कोई बात नहीं एक फ़ाइल को नष्ट करने की आवश्यकता है एक आवेदन के विकास कर रहा हूँ।

using System; 
using System.IO; 

namespace DotNet_Concepts.File_Operation 
{ 
    class Deleting_File_Which_Is_In_Use 
    { 
     static void Main(string[] args) 
     { 
      StreamReader lclFileStream = null; 
      string lclFileName=string.Empty; 
      try 
      { 
       [email protected]"E:\Visual Studio 2008 Projects\DotNet Concepts\DotNet Concepts\Local Files\Garbage.txt"; 
       if (File.Exists(lclFileName)) 
       { 
        lclFileStream = new StreamReader(lclFileName); 
        if (lclFileStream != null) 
        { 
         //Doing some operation 
        } 
        //Deleting the file before closing the stream 
        File.Delete(lclFileName); 
       } 
      } 
      catch (Exception ex) 
      { 

       System.Diagnostics.Debug.WriteLine(ex.StackTrace); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

मैं उसी प्रक्रिया द्वारा उपयोग की जाने वाली फ़ाइल को हटा रहा हूं। यह संभव फ़ाइल को हटाने का है

धन्यवाद, अमित शाह

+0

लेकिन फ़ाइल उपयोग में है। तो इसे क्यों हटाएं? –

+2

डुप्लिकेट - http://stackoverflow.com/questions/1040/how-do-i-delete-a-file-which-is-locked-by-another-process-in-c? –

+0

यह आपके प्रश्न से स्पष्ट नहीं है, अगर आप एक फाइल खोलना चाहते हैं जिसे आपने खोला है। यदि ऐसा है, तो एड स्वैंगरेन की सलाह का उपयोग करें। –

उत्तर

1

मैं फ़ाइल जो एक ही प्रक्रिया

द्वारा किया जाता है बस पहले फ़ाइल को बंद को हटाने कर रहा हूँ ...

+0

को प्रतिस्थापित करना है और यदि आपकी फ़ाइल अन्य प्रक्रियाओं द्वारा उपयोग की जाती है तो आप हैंडल को बंद करने के लिए CreateRemoteThread() का प्रयास कर सकते हैं। – fardjad

+0

उपर्युक्त कोड केवल त्रुटि प्रदर्शित करने के लिए है। मेरे पास एक होस्टेड एसएफएफ़ फ़ाइल है जो WAV फ़ाइल का उपयोग करती है। मेरे पास एक बैक एंड एप्लिकेशन है जो एक ही तरंग फ़ाइल को संशोधित करता है जिसका उपयोग SWF द्वारा किया जा रहा है। मैं चाहता हूं कि अद्यतन लहर को एसएफएफ में प्रस्तुत किया जाए। और मौजूदा फ़ाइल को प्रतिस्थापित करने का एकमात्र तरीका है। –

+0

आप मानते हैं कि यह "एकमात्र रास्ता" है। –

6

हां, यह एक ज्ञात विंडोज सुरक्षा चिंता है, जिसे "हैंडल रीसायकल हमला" कहा जाता है। अनियंत्रित कर्नेल हैंडल टेबल पर चलना तकनीकी रूप से संभव है, संभालने वाली प्रक्रिया में कोड डालें और फ़ाइल हैंडल को बंद करने के लिए CloseHandle() को कॉल करें। शोषण करने में बहुत मुश्किल है, आपको ऐसा करने के लिए व्यवस्थापक अधिकारों की आवश्यकता है। यदि आपके पास यह अधिकार है तो प्रक्रिया को खराब करने के लिए बेहतर तरीके।

सेवा के हमले का अस्वीकार करने का क्या परिणाम है, जो कि मशीन को यादृच्छिक रूप से फैलता है, यह पता लगाने के लिए कि यह कैसे हुआ। प्रक्रिया को पता नहीं है कि फ़ाइल हैंडल बंद था, यह इसे बंद नहीं किया था, और सिर्फ संभाल में लिखता रहता है। लिखित डेटा बिट बाल्टी में आता है। WriteFile() के वापसी मूल्य को अनदेखा करना अधिकांश अप्रबंधित कार्यक्रमों में बहुत मानक है।

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

हिलेरिटी तब आती है जब कोई उस डेटाबेस से डेटा को वापस पढ़ने की कोशिश करता है। या जो भी अन्य संसाधन नष्ट हो गया है, यह यादृच्छिक है। हालांकि आप थोड़े से ढके हुए हैं, कोई भी यह समझने में सक्षम नहीं होगा कि यह आपका प्रोग्राम था जिसने मशीन को नष्ट कर दिया था।

2
using System.Collections; 
using System.Diagnostics; 
using System.Management; 

if (File.Exists(@"D:\New folder\Test0001.wav")) 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    FileInfo f = new FileInfo(@"D:\New folder\Test0001.wav"); 
    f.Delete(); 
} 
+0

जो "बलपूर्वक" नहीं है। अगर फ़ाइल उपयोग में है तो कोड अपवाद फेंक देगा।इसके अलावा फ़ाइल। डिलीट (पथ) ओपी के रूप में उपयोग किया गया है वही काम करेगा जैसा आपने FileInfo.Delete() के साथ किया है। –

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