c# - PictureBox.Load कुछ सिस्टम पर छवि लॉक क्यों है?




winforms bitmap (2)

हां, यह सामान्य है किसी भी ऑपरेटिंग सिस्टम पर होता है, इसमें उपयोगकर्ता फ़ोल्डर स्थान के साथ कुछ भी नहीं होता है PictureBox.Load () विधि फ़ाइल सिस्टम के अलावा अन्य स्थानों से छवियों को लोड करने के लिए इस्तेमाल करने का इरादा था। एक वेब साइट की तरह जो धीमा है, यह डाउनलोड होने पर UI को ठंड से बचाता है।

यह आंतरिक रूप से एक FileStream का उपयोग करता है जब यह पता चलता है कि आप पास यूआरएल वास्तव में एक फ़ाइल है और एक वेबसाइट का नाम नहीं है जब तक कि पिक्चरबॉक्स स्वयं का निपटारा नहीं हो जाता है या आप लोड () विधि को फिर से कॉल करते हैं, तब तक यह फ़ाइल स्ट्रीम निष्पादित नहीं होता है एक आवश्यकता है क्योंकि छवि। स्ट्रीमस्ट्रीम () को स्ट्रीम को तब तक पठनीय रहने की आवश्यकता है जब तक कि अब छवि का उपयोग नहीं किया जाता है। यह फ़ाइल स्ट्रीम है जो फ़ाइल पर लॉक रखता है। PictureBox.Image को खंगालना भी FileStream निपटाने के लिए पर्याप्त नहीं है, छवि ऑब्जेक्ट यह एक तस्वीर बॉक्स के अंदर प्रदर्शित किया जा रहा है कि पता नहीं है।

इस समस्या को हल करने के कई तरीके हैं:

  • लोड () की बजाय छवि प्रॉपर्टी का उपयोग करें, उसे चित्र से आवंटित करें। .FromFile () छवि को निपटाते समय भी फ़ाइल पर ताला जारी करता है। जैसा कि आपने पाया
  • एक डमी छवि को चारों ओर रखें, शायद वह एक "लोड हो रहा है ..." बिटमैप प्रदर्शित करता है लोड () इसे सबसे पहले फाइल पर लॉक जारी करना
  • पिक्चरबॉक्स का निपटारा करें और इसे पुन: बनाएँ।

(यदि आप पूरी कहानी पढ़ना नहीं चाहते हैं, तो कृपया प्रश्न के निचले हिस्से पर संपादन देखें।)

नमस्ते,

मैं stackoverflow के लिए नया हूँ मुझे गलत मत समझो, मैं इसे अक्सर प्रायः उपयोग करता हूँ लेकिन अब तक मैं वास्तव में कुछ पोस्ट नहीं किया। इसका कारण यह है कि मेरे पास कुछ नया / उपयोगी नहीं था और मेरा अंग्रेजी अच्छा नहीं है। पहली चीज (हो सकती है) बदल गई, बाद में नहीं किया।

मैं हाल ही में एक ग्राहक के विंडोज 7 सिस्टम पर एक समस्या में भाग गया मैं ClickOnce के माध्यम से एक सी # नेट 4.0 विंडोज फॉर्म आवेदन भेज रहा था। असल में, यह एक ऐसा अनुप्रयोग है जो बिटमैप फ़ाइल बनाता है और यह उपयोगकर्ता को दिखाता है। यदि बिटमैप निर्माण के पहले मौजूद है, तो मौजूदा फ़ाइल पहले हटा दी जाती है। इसके बाद नई फ़ाइल बनाई गई और एक चित्र बॉक्स द्वारा लोड की गई।

ग्राहक की व्यवस्था में निम्नलिखित बात हुई: आवेदन शुरू करने के बाद पहली रचना सफल हुई - दूसरे और सभी निम्नलिखित वाले नहीं करते। फाइल को हटाया नहीं जा सकता है, क्योंकि कुछ प्रक्रिया इसे अवरुद्ध कर रही है। यह प्रक्रिया खुद ही आवेदन है

System.IO.IOException: प्रक्रिया "फाइलनाम" फ़ाइल का उपयोग नहीं कर सकती क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है

अच्छा, ज़ाहिर है कि कुछ असामान्य नहीं है बात मैं कई सिस्टम पर आवेदन का परीक्षण किया है कोई भी यह अपवाद नहीं दिखाया और अब तक मैं एक कोड त्रुटि देखने में असमर्थ हूं।

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

इसके साथ मैं अपना कोड बदल सकता हूं ताकि अपवाद अब और न हो। लेकिन मुझे समझ में नहीं आता कि यह क्यों है। तो शायद मेरे कोड में कुछ गड़बड़ है और त्रुटि उस विशेष परिस्थितियों में ही प्रकट होती है या हो सकता है कि कोड ठीक है और इसका कारण कहीं और है। मुझे आशा थी कि आप मेरी मदद कर सकेंगे।

तो यहाँ कुछ कोड है जो मैं एक साथ रखा है, जो एक ही व्यवहार को दिखाता है। मैंने 3 बटन, एक OpenFileDialog और एक प्रपत्र पर एक पिक्चरबॉक्स इस्तेमाल किया था। पहली बात यह है कि एक छवि फ़ाइल चुनना है। दो शेष बटनों में से एक को दबाकर इसे आवेदन के मुख्य फ़ोल्डर में कॉपी किया जाता है। कॉपी किए जाने के बाद इसे चित्र बॉक्स द्वारा दिखाया गया है। वैसे, अगर कोई क्लिकऑन-एप्लिकेशन या "सामान्य" एक है, तो यह कोई फर्क नहीं पड़ता

String m_FileName;

private void btnChooseFile_Click(object sender, EventArgs e) {
    if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // If file was chosen, set file name for later use and activate buttons.
        m_FileName = "Test" + Path.GetExtension(openFileDialog1.FileName);
    }
}

private void button1_Click(object sender, EventArgs e) {

    // This is not working.
    if(this.pictureBox1.Image != null) {
        //Image img = this.pictureBox1.Image; // I was not sure, if maybe the pictureBox somehow prevents the disposing of the image, as long as it's assigned to it.
        //this.pictureBox1.ImageLocation = null; // So I set them null, both the image and the image location.
        //this.pictureBox1.Image = null; 
        //img.Dispose(); // Then I disposed the image.

        this.pictureBox1.Image.Dispose(); // The short version. It is not working either way.
        this.pictureBox1.Image = null;
    }
    (new FileInfo(openFileDialog1.FileName)).CopyTo(m_FileName, true); // But still this is where the Exception occurs.
    this.pictureBox1.Load(m_FileName);
}

private void button2_Click(object sender, EventArgs e) {

    //This is working.
    if(this.pictureBox1.Image != null) {
        //Image img = this.pictureBox1.Image;
        //this.pictureBox1.Image = null;
        //img.Dispose();

        this.pictureBox1.Image.Dispose();
        this.pictureBox1.Image = null;
    }
    (new FileInfo(openFileDialog1.FileName)).CopyTo(m_FileName, true);
    pictureBox1.Image = Image.FromFile(m_FileName);
}

अब निम्न क्या होता है: अगर मैं आवेदन प्रारंभ करता हूं और दो बार बटन 1 पर क्लिक करता हूं, तो मुझे अपवाद मिल जाएगा (दूसरे क्लिक पर)। अगर मैं इसे शुरू करता हूँ और दो बार 2 बटन पर क्लिक करता हूं, तो मैं नहीं। अगर मैं आवेदन शुरू करता हूँ और पहले बटन 2 पर क्लिक करता हूं और उस बटन के बाद 2, मुझे अपवाद मिलेगा। इसलिए, चित्र। लोड-फ़ंक्शन किसी तरह फाइल को अवरुद्ध करता है, भले ही मैं उसका निपटारा करता हूं।

जब मैंने इंटरनेट पर खोज की, तो मुझे माइक्रोसॉफ्ट से एक लेख मिला: http://support.microsoft.com/kb/309482/en-us लेकिन यह बैल की आंख को नहीं मारता है

ध्यान दें, दोनों संस्करण मेरे सभी परीक्षण मशीनों पर काम कर रहे हैं। मुझे अपवाद मिलता है जब मैं उपयोगकर्ता फ़ोल्डर को गैर-खिड़कियों-विभाजन में बदल देता हूं।

ऐसा क्यों है? और प्रस्तुत संस्करणों में अंतर कहां है?

संपादित करें

ठीक है, अब तक की पहली और एकमात्र प्रतिक्रिया की वजह से, मुझे लगता है कि यह अभी भी स्पष्ट नहीं है, वास्तव में क्या होता है: अगर मैं उपरोक्त कोड लेता हूं, उसे एक विंडोज़ प्रपत्र आवेदन में रखकर, इसे संकलित करके इसे अलग से चलाएं कंप्यूटर (काम पर, घर पर, कोई फर्क नहीं पड़ता) यह काम करता है - दोनों बटन 1 और बटन 2 (उनसे जुड़ी हुई क्लिक-फ़ंक्शंस के साथ) मुझे जितनी बार पसंद किया जा सकता है - कोई अपवाद नहीं फेंका गया। अगर मैं एक कंप्यूटर पर आवेदन चलाता हूं, जहां मैंने उपयोगकर्ता फ़ोल्डर बदल दिया, और दूसरी बार बटन 1 पर क्लिक किया - बैम - आईओई एक्सप्शन, प्रक्रिया द्वारा लॉक फाइल। बटन 2 तब तक काम करता है जब तक मैं बटन 1 दबा नहीं करता।

पहला जवाब है कि मुझे हर सिस्टम पर ताला लगा देना चाहिए। लेकिन मैं नहीं करता (जब तक मैं उपयोगकर्ता फ़ोल्डर नहीं बदलता)! मैंने इसे हर एक कंप्यूटर पर परीक्षण किया था, जिस पर मैं अपना हाथ पा सकता था - कोई आईओएक्सेशन नहीं मैंने एक नई प्रणाली स्थापित की, बस मेरी कंपनी में सिस्टम में कुछ विशेष परिवर्तनों को नकारने के लिए - दोनों बटन x_Click फ़ंक्शंस - कोई अपवाद या तो नहीं। मैंने प्रोग्राम को दूसरे कंप्यूटर पर भी संकलित किया - एक ही व्यवहार उस अपवाद को फेंकने के लिए केवल तीन सिस्टम बदले गए उपयोगकर्ता फ़ोल्डर वाले थे।

अब तक मेरे पास कोई सुराग नहीं है, इसलिए व्यवहार में यह अंतर तब होता है। क्या कोई मुझे मदद कर सकता है?

कोई?


यह लिंक देखें यह दृश्य स्टूडियो में आईडीई के साथ वास्तव में एक मुद्दा है

https://support.microsoft.com/en-us/kb/311754







file-locking