स्रोत फ़ोल्डर से छवियों को लगातार कैसे पढ़ें?


मेरे कार्यक्रम में निम्नलिखित चरण शामिल हैं:
1. स्रोत फ़ोल्डर से किसी भी नई छवि को पढ़ें
2. प्रक्रिया छवि (वस्तुओं का पता लगाएं और उन्हें डेस्क्यू करें)
3. डेस्कवेड ऑब्जेक्ट छवियों को लक्ष्य फ़ोल्डर में सहेजें
…दोहराना

विचार यह है कि स्टैम्प को स्कैन करते समय प्रोग्राम प्रत्येक स्टैम्प को व्यक्तिगत रूप से आउटपुट करता है या यदि स्टैम्प क्लस्टर किए जाते हैं तो उन्हें समूहीकृत किया जाता है। उपयोगकर्ता को संसाधित होने के दौरान लगातार स्कैन करने में सक्षम होना चाहिए।

लक्ष्य फ़ोल्डर में नई छवियों का पता लगाने के तीन तरीकों के आधार पर, प्रोग्राम तीन अलग-अलग तरीकों से व्यवहार करता है। व्यवहार में तीसरे तरीके का ही प्रयोग किया जायेगा। उम्मीद है कि पहले दो यह समझाने में मदद कर सकते हैं कि क्या हो रहा है और क्यों हो रहा है।

1. खींचें और छोड़ें
किसी छवि को मैन्युअल रूप से फ़ोल्डर में खींचने और छोड़ने पर सब कुछ ठीक काम करता है; मैं इसे अनिश्चित काल तक कर सकता हूं और आउटपुट सही हैं।

2. कॉपी पेस्ट करें
जब किसी छवि को लक्ष्य फ़ोल्डर में स्थानीय रूप से कॉपी और पेस्ट किया जाता है, तो प्रोग्राम निम्नलिखित अपवाद दिखाते हुए तुरंत रुक जाता है:

System.IO.IOException: 'Unable to access the file xxx because it is being used by another process.'

यही अपवाद तब होता है जब छवियों को लक्ष्य फ़ोल्डर में कॉपी-पेस्ट किया जाता है।

3. स्कैन प्रोग्राम से आउटपुट
मैं स्कैनस्नैप एसवी600 का उपयोग करता हूं जो लक्ष्य फ़ोल्डर में स्टैम्प के असंसाधित स्कैन को सहेजता है। अब यहाँ वह मामला आता है जो मुझे चकित कर देता है: मेरा प्रसंस्करण कार्यक्रम अपने व्यवहार में परिवर्तन करता है। जब भी मैं प्रोग्राम को डीबग मोड में प्रारंभ करता हूं तो पहला स्कैन हमेशा सफल होता है। लेकिन प्रोसेसिंग प्रोग्राम के उसी रन के भीतर बाद के स्कैन में पढ़ना उस स्थिति में विफल हो जाता है जब पिछला डीबग सत्र सफल हुआ था। दूसरे शब्दों में: दो में से एक बार प्रोग्राम इच्छानुसार व्यवहार करता है। और दूसरी बार यह दूसरे स्कैन पर रुक जाता है, जिससे मुझे उपरोक्त त्रुटि मिलती है।

नई छवियों का पता लगाने के लिए मैं इसका उपयोग करता हूं:

सी#
var fileSystemWatcher = new FileSystemWatcher(@inputDir)
{
    Filter = "*.jpg",
    NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
    EnableRaisingEvents = true
};
fileSystemWatcher.Created += new FileSystemEventHandler(OnFileCreated);

मैंने क्या प्रयास किया है:

इसके अलावा यह प्रसंस्करण शुरू होने से पहले कोड का हिस्सा है। यह सबसे सुंदर नहीं है और `थ्रेड.स्लीप()` का उपयोग करने पर थोड़ा ‘हैकी’ लगता है। शायद यहाँ कोई सुराग है?

सी#
private void OnFileCreated(object sender, FileSystemEventArgs e)
{
    sw.Restart();
    string imagePath = e.FullPath;
    inputFiles.AddToQ(imagePath);
    Console.WriteLine("{0} is queued.", e.FullPath);

    int number = 0;
    if (!int.TryParse(setCluster.Text.Trim(), out number))
    {
        MessageBox.Show("Please enter a valid number for Clustering.");
        setCluster.Text = "20";
    }
    else
    {
        while (inputFiles.Inspect() != imagePath) Thread.Sleep(100);
        try
        {
            lock (locker)
            {
                Bitmap incoming = new Bitmap(inputFiles.Process());
                Console.WriteLine("{0} is being processed.", e.FullPath);

                if (currentScan.Image != null) currentScan.Image = null;
                currentScan.Invoke((Action)
                delegate ()
                {
                    currentScan.Image = (Image)new Bitmap(e.FullPath);
                    currPathText.Text = imagePath;
                });

                // processing step
                Bitmap resized = new Bitmap(incoming, new
                    Size(Convert.ToInt32(incoming.Width / Variables.ScalingFact),
                    Convert.ToInt32(incoming.Height / Variables.ScalingFact)));
                .....

समाधान 1

यह सरल है। आप प्रतिलिपि प्रक्रिया पूरी होने और फ़ाइल बंद करने से पहले फ़ाइल को पढ़ने का प्रयास कर रहे हैं।

आपको बस फ़ाइल खोलने का प्रयास करना है। यदि यह अपवाद फेंकता है क्योंकि यह पहले से ही उपयोग में है, तो थोड़ा इंतजार करें और पुनः प्रयास करें। तब तक प्रयास करते रहें जब तक कि आप या तो फ़ाइल न खोल लें या मनमाने ढंग से चुनी गई कुछ पुनः प्रयास सीमा समाप्त न कर लें।

コメント

タイトルとURLをコピーしました