2010-06-07 21 views
16

क्या यह पता लगाने का कोई तरीका है कि कोई फ़ाइल पहले से खुली है या नहीं?जांचें कि कोई फ़ाइल खुली है

+2

कृपया अधिक विशिष्टताओं की पेशकश करें। आपकी प्रक्रिया, या दूसरी प्रक्रिया से पहले से ही खुला है? खुली अवधि, या सिर्फ लिखने के उपयोग के साथ खोला? साझा करने के बारे में क्या? आदि यह सवाल बहुत अस्पष्ट है। – hemp

उत्तर

26
protected virtual bool IsFileinUse(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(); 
    } 
    return false; 
} 
+2

यदि प्रक्रिया में फ़ाइल तक पहुंच पहुंच नहीं है तो यह एक भ्रामक परिणाम उत्पन्न करेगा (खुले असफल हो जाएंगे, लेकिन जरूरी नहीं है क्योंकि एक हैंडल मौजूद है।) पढ़ने के लिए खोलना कम त्रुटि-प्रवण होगा। – hemp

+4

आश्चर्यजनक है कि अधिकांश भाषाओं में फ़ाइल का परीक्षण करने का कोई तरीका नहीं है। हम ओएस/2 में सी ++ के तहत उसी प्रकार की विधि का उपयोग करते थे। यानी फ़ाइल को अनन्य खोलने का प्रयास करें। यह काफी अच्छी तरह से काम करता है, लेकिन मैंने कभी इसे सुरुचिपूर्ण नहीं सोचा है। – Matt

+2

यह एक भाषा सुविधा नहीं है, यह एक ओएस सुविधा है। उस जानकारी के लिए पूछने के लिए बस एक साधारण एपीआई (विंडोज़ में) मौजूद नहीं है। यह प्राप्त करना संभव है, लेकिन यह निम्न स्तर है और ऐसे कई पैरामीटर हैं जिन्हें "खुले" के अर्थ के बारे में जानने के लिए निर्दिष्ट किया जाना होगा। – hemp

7

@pranay राणा के रूप में, लेकिन हमें विश्वास है कि हम अपने फ़ाइल हैंडल को बंद करने की जरूरत है:

public bool IsFileInUse(string path) 
{ 
    if (string.IsNullOrEmpty(path)) 
    throw new ArgumentException("'path' cannot be null or empty.", "path"); 

    try { 
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
    } catch (IOException) { 
    return true; 
    } 

    return false; 
} 
+0

@pranay rana के समान, मैंने इस विधि का परीक्षण किया, लेकिन यह पता नहीं लगा कि फ़ाइल नोटपैड में कब खुलती है । – James

1

आप मतलब है कि आप जाँच करना चाहते हैं, तो एक फ़ाइल खुला है, तो इससे पहले कि आप को खोलने का प्रयास , फिर नहीं। (कम से कम निम्न स्तर के बिना नहीं और सिस्टम में खुले प्रत्येक फ़ाइल हैंडल की जांच करें।)

इसके अलावा, जब आप इसे प्राप्त करते हैं तो जानकारी पुरानी होगी। भले ही परीक्षण वापस आएगा कि फ़ाइल खुली नहीं है, फिर भी आपको रिटर्न वैल्यू का उपयोग करने का मौका मिलने से पहले खोला जा सकता था।

तो, स्थिति को संभालने का सही तरीका फ़ाइल खोलने का प्रयास करना है, और होने वाली किसी भी त्रुटि को संभालना है।

0

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

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