Bagaimana cara terus membaca gambar dari folder sumber?

pemrograman


Program saya terdiri dari langkah-langkah berikut:
1. membaca gambar baru apa pun dari folder sumber
2. memproses gambar (mendeteksi objek dan mendeskripsikannya)
3. simpan gambar objek yang dideskripsikan ke dalam folder target
…mengulang

Idenya adalah ketika memindai prangko, program mengeluarkan setiap prangko secara individual atau dikelompokkan jika prangko tersebut dikelompokkan. Pengguna harus dapat terus melakukan pemindaian saat sedang diproses.

Program ini berperilaku dalam tiga cara berbeda, berdasarkan tiga cara mendeteksi gambar baru di folder target. Dalam prakteknya hanya cara ketiga yang akan digunakan. Dua penjelasan pertama diharapkan dapat membantu menjelaskan apa yang terjadi dan alasannya.

1. Seret dan lepas
Semua berfungsi dengan baik saat menarik dan melepas gambar ke dalam folder secara manual; Saya dapat melakukan ini tanpa batas waktu dan hasilnya benar.

2. Salin tempel
Saat menyalin dan menempelkan gambar secara lokal di folder target, program segera berhenti, menampilkan pengecualian berikut:

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

Pengecualian yang sama terjadi ketika menyalin-menempelkan gambar di dalam folder target.

3. Keluaran dari program pemindaian
Saya menggunakan ScanSnap SV600 yang menyimpan pindaian prangko yang belum diproses di folder target. Sekarang inilah kasus yang membingungkan saya: program pemrosesan saya berganti-ganti perilakunya. Pemindaian pertama selalu berhasil setiap kali saya memulai program dalam mode Debug. Namun pembacaan pada pemindaian berikutnya dalam menjalankan program pemrosesan yang sama gagal jika sesi Debug sebelumnya berhasil. Dengan kata lain: satu dari dua kali program berperilaku sesuai keinginan. Dan di lain waktu berhenti pada pemindaian kedua, memberi saya kesalahan di atas.

Untuk mendeteksi gambar baru saya menggunakan:

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

Apa yang saya coba:

Selanjutnya ini adalah bagian dari kode sebelum pemrosesan dimulai. Ini bukan yang terindah dan terasa sedikit ‘retas’ menggunakan `Thread.Sleep()`. Mungkin ini petunjuknya?

C#
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)));
                .....

Solusi 1

Ini sederhana. Anda mencoba membaca file sebelum proses penyalinan selesai dan menutup file.

Anda hanya perlu MENCOBA membuka file tersebut. Jika muncul pengecualian karena sudah digunakan, tunggu sebentar dan coba lagi. Teruslah mencoba sampai Anda membuka file atau menghabiskan batas percobaan ulang yang Anda pilih secara sewenang-wenang.

コメント

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