2012-08-01 19 views
6

मैं एक अजीब समस्या (जो शायद ज्ञान की मेरी कमी है) के साथ अटक कर रहा हूँ, मैं अपमानजनक कोड मौजूद:हटाएं कार्यों को हटा देता है तब भी जब बुला एप्लिकेशन बंद हो

try 
{ 
    f.Delete(); 
    fTemp.MoveTo(f.FullName); 
    Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName); 
} 
catch (IOException ex) 
{ 
    Console.WriteLine("ERROR: Output file has IO exception > {0}", f.FullName); 
    Environment.ExitCode = 1; 
} 

च और fTemp FileInfo वस्तुओं रहे हैं। इसलिए यदि मैं इसे कोड के साथ चलाता हूं जहां f एक mediaplayer में चल रही एक वीडियो फ़ाइल है तो यह अपवाद फेंकता है। यह ठीक काम करता है और उम्मीद के अनुसार। अब जब मैं mediaplayer बंद करता हूं तो यह फ़ाइल हटा देता है !? भले ही मेरा आवेदन लंबा बंद हो। जब भी मैं विजुअल स्टूडियो को बंद करता हूं तब भी मैं फ़ाइल को हटा देता हूं, जब मैं mediaplayer को बंद करता हूं। जैसे कि कुछ कॉलबैक कहीं भी स्थापित किया जा रहा है यह सुनिश्चित करने के लिए कि फ़ाइल किसी बिंदु पर हटा दी जाती है। अवांछित व्यवहार में यह संभोग। लेकिन मैं यह पता लगाने नहीं कर सकते वास्तव में गलत हो जाता है क्या ... अब के लिए

परिणाम:

if (!IsFileLocked(f)) 
{ 
    try 
    { 
     f.Delete(); 
     fTemp.MoveTo(f.FullName); 
     Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName); 
    } 
    catch (IOException ex) 
    { 
     Console.WriteLine("ERROR: Output file has IO exception > {0}", f.FullName); 
     Environment.ExitCode = 1; 

    } 

    catch (UnauthorizedAccessException ex) 
    { 
     Environment.ExitCode = 2; 
     Console.WriteLine("ERROR: Output file is locked > {0}", f.FullName); 

    } 
} 
else 
{ 
    Environment.ExitCode = 3; 
    Console.WriteLine("ERROR: Couldn't delete file was locked"); 

} 

मैं जानता हूँ कि मैं अब भी हटाएँ और MoveTo के बीच बेहतर कर सकते हैं, लेकिन अभी तो मैं अपना परिवर्तन ले लेंगे , शॉटगन कोडिंग .....

+5

मीडिया प्लेयर ने सबसे अधिक संभावना FILE_SHARE_DELETE के साथ फ़ाइल खोला, जिसका अर्थ है "जब मैं इसका उपयोग कर रहा हूं तो लोग फ़ाइल को हटा दें।" फ़ाइल को हटाने के लिए चिह्नित किया गया है और जब मीडिया प्लेयर फ़ाइल बंद करता है तो हटाना पूरा हो जाता है। –

+2

आपके IOException के साथ दिया गया संदेश क्या है? –

+0

लेकिन फिर मैं उम्मीद करता हूं कि अपवाद नहीं उठाया जाएगा। इसके अलावा मैंने इसे विंडोज मीडिया प्लेयर के साथ खोला, जो मेरी पुस्तक में फाइलों को कुख्यात रूप से लॉक कर रहा है ... या यह आपके ध्वज के समान नहीं है। – JHN

उत्तर

3

आपको IOException मिल रहा है क्योंकि फ़ाइल को तुरंत हटाया या लिखा नहीं जा सकता है। हालांकि, जब आप Delete() पर कॉल करते हैं, तो ऐसा लगता है कि फ़ाइल को हटाने के लिए बुलाया जा रहा है।

हालांकि मीडिया प्लेयर फ़ाइल को खोलने के दौरान हटाए जाने से रोकता है, फिर भी यह बंद होने पर फ़ाइल को हटाने के लिए चिह्नित किया जाता है, भले ही आपका प्रोग्राम चल रहा हो। तो जब मीडिया प्लेयर बंद हो जाता है तो फ़ाइल हटा दी जाती है।

आप यह जांच सकते हैं कि फ़ाइल निम्नलिखित कोड के साथ उपयोग में है, here से ली गई है। Delete और Copy इसे सशर्त पर लॉक न करें, और आपको अच्छा होना चाहिए।

try 
{ 
    if(!IsFileLocked(f)) 
    { 
     f.Delete(); 
     fTemp.MoveTo(f.FullName); 
     Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName); 
    } 
} 

protected virtual bool IsFileLocked(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
    //the file is unavailable because it is: 
    //still being written to 
    //or being processed by another thread 
    //or does not exist (has already been processed) 
    return true; 
    } 
    finally 
    { 
    if (stream != null) 
     stream.Close(); 
    } 

    //file is not locked 
    return false; 
} 
+0

क्या मैं "ध्वज साफ़ नहीं कर सकता" या जो भी machanisme जगह में था। या बेहतर अभी तक, क्या कोई जांच है जो फ़ाइल को पहले स्थान पर हटाया जा सकता है, यह व्यवहार अब मेरे लिए अप्रत्याशित है। – JHN

+0

ऊपर मेरा संपादन देखें। –

+0

मुझे लगता है, मुझे अपना जवाब लिखने में बहुत लंबा लगा ... :) – Hinek

1
विंडोज एसडीके से

:

DeleteFile समारोह पास पर हटाने के लिए एक फ़ाइल चिह्नित करता है। इसलिए, फ़ाइल हटाना तब तक नहीं होता जब तक कि फ़ाइल के अंतिम संभाल बंद नहीं हो जाते। फ़ाइल खोलने के लिए CreateFile के बाद के कॉल ERROR_ACCESS_DENIED के साथ विफल हो जाते हैं।

0

जहाँ तक मैं समझता हूं, आप चाहते हैं कि आपका प्रोग्राम तब तक प्रतीक्षा करे जब तक फ़ाइल को हटाया जा सके और फिर इसे हटा दें और दूसरी फ़ाइल को स्थानांतरित करें।

ऐसा करने के लिए, यदि आप फ़ाइल पर हैंडल खोलते हैं, तो आप जांच सकते हैं, लेकिन इसे अप्रबंधित कोड की आवश्यकता है। एक और तरीका है इस सवाल का जवाब से methode उपयोग करने के लिए होगा: Is there a way to check if a file is in use?

protected virtual bool IsFileLocked(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
      stream.Close(); 
    } 

    //file is not locked 
    return false; 
} 

इससे पहले कि आप फ़ाइल आप

ए) पाश जब तक फ़ाइल को हटाया जा सकता सकता है

while(IsFileLocked(f)) { Thread.Sleep(100); } 
नष्ट करने के लिए शुरू

या बी) को रद्द

if (IsFileLocked(f)) { return; } 

आप एक चुन सकते हैं या बी निर्भर करता है आपकी आवश्यकताओं पर।

+0

दो शब्द: 'रेस कंडीशन' – asawyer