كيف تقرأ الصور بشكل مستمر من المجلد المصدر؟


يتكون برنامجي من الخطوات التالية:
1. اقرأ في أي صورة جديدة من المجلد المصدر
2. معالجة الصورة (اكتشاف الأشياء وتعديلها)
3. حفظ صور الكائنات المنحرفة في المجلد الهدف
…يكرر

والفكرة هي أنه أثناء مسح الطوابع، يقوم البرنامج بإخراج كل ختم على حدة أو مجمعة إذا كانت الطوابع مجمعة. يجب أن يكون المستخدم قادرًا على إجراء عمليات الفحص بشكل مستمر أثناء معالجتها.

يتصرف البرنامج بثلاث طرق مختلفة، بناءً على ثلاث طرق لاكتشاف الصور الجديدة في المجلد الهدف. ومن الناحية العملية سيتم استخدام الطريقة الثالثة فقط. نأمل أن يساعد الأولان في شرح ما يحدث ولماذا.

1. السحب والإفلات
يعمل كل شيء بشكل جيد عند سحب وإسقاط صورة في المجلد يدويًا؛ يمكنني القيام بذلك إلى أجل غير مسمى والمخرجات صحيحة.

2. انسخ والصق
عند نسخ صورة ولصقها محليًا في المجلد الهدف، يتوقف البرنامج فورًا، ويظهر الاستثناء التالي:

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

يحدث هذا الاستثناء نفسه عند نسخ الصور ولصقها داخل المجلد الهدف.

3. الإخراج من برنامج المسح
أستخدم ScanSnap SV600 الذي يحفظ عمليات المسح غير المعالجة للطوابع في المجلد الهدف. الآن تأتي الحالة التي تحيرني: برنامج المعالجة الخاص بي يتغير في سلوكه. ينجح الفحص الأول دائمًا في كل مرة أقوم فيها بتشغيل البرنامج في وضع التصحيح. لكن القراءة في الفحص اللاحق خلال نفس التشغيل لبرنامج المعالجة تفشل في حالة نجاح جلسة التصحيح السابقة. بمعنى آخر: مرة واحدة من مرتين يتصرف البرنامج حسب الرغبة. وفي أحيان أخرى يتوقف عند الفحص الثاني، ويعطيني الخطأ أعلاه.

لاكتشاف الصور الجديدة التي أستخدمها:

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

ما حاولت:

علاوة على ذلك، يعد هذا جزءًا من التعليمات البرمجية قبل بدء المعالجة. إنه ليس الأجمل ويشعر بأنه “اختراقي” بعض الشيء باستخدام “Thread.Sleep()”. ربما هنا هو فكرة؟

ج#
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をコピーしました