Làm cách nào để đọc liên tục hình ảnh từ thư mục nguồn?

lập trình


Chương trình của tôi bao gồm các bước sau:
1. đọc bất kỳ hình ảnh mới nào từ thư mục nguồn
2. xử lý hình ảnh (phát hiện vật thể và xóa chúng)
3. lưu hình ảnh đối tượng đã được xóa vào thư mục đích
…lặp lại

Ý tưởng là trong khi quét tem, chương trình sẽ xuất ra từng tem riêng lẻ hoặc được nhóm lại nếu các tem được nhóm lại. Người dùng có thể liên tục thực hiện quét trong khi chúng đang được xử lý.

Chương trình hoạt động theo ba cách riêng biệt, dựa trên ba cách phát hiện hình ảnh mới trong thư mục đích. Trong thực tế chỉ có cách thứ ba sẽ được sử dụng. Hai điều đầu tiên hy vọng có thể giúp giải thích điều gì đang xảy ra và tại sao.

1. Kéo và thả
Tất cả đều hoạt động tốt khi kéo và thả hình ảnh vào thư mục theo cách thủ công; Tôi có thể làm điều này vô thời hạn và kết quả đầu ra là chính xác.

2. Sao chép dán
Khi sao chép và dán hình ảnh cục bộ vào thư mục đích, chương trình sẽ dừng ngay lập tức, hiển thị ngoại lệ sau:

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

Ngoại lệ tương tự này xảy ra khi sao chép-dán hình ảnh trong thư mục đích.

3. Đầu ra từ chương trình quét
Tôi sử dụng ScanSnap SV600 để lưu các bản quét tem chưa được xử lý vào thư mục đích. Bây giờ đến trường hợp khiến tôi bối rối: chương trình xử lý của tôi thay đổi hành vi. Lần quét đầu tiên luôn thành công mỗi khi tôi khởi động chương trình ở chế độ Gỡ lỗi. Tuy nhiên, việc đọc trong lần quét tiếp theo trong cùng một lần chạy chương trình xử lý đó không thành công trong trường hợp phiên Gỡ lỗi trước đó thành công. Nói cách khác: một trong hai lần chương trình hoạt động như mong muốn. Và những lần khác, nó dừng lại ở lần quét thứ hai, gây ra lỗi trên cho tôi.

Để phát hiện hình ảnh mới tôi sử dụng:

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

Những gì tôi đã thử:

Hơn nữa đây là một phần của mã trước khi quá trình xử lý bắt đầu. Nó không phải là đẹp nhất và có cảm giác hơi ‘hacky’ khi sử dụng `Thread.Sleep()`. Có lẽ đây là một đầu mối?

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

Giải pháp 1

Cái này đơn giản. Bạn đang cố đọc tệp trước khi quá trình sao chép hoàn tất và đóng tệp.

Bạn chỉ cần THỬ mở tệp. Nếu nó đưa ra một ngoại lệ vì nó đã được sử dụng, hãy đợi một chút và thử lại. Tiếp tục thử cho đến khi bạn mở tệp hoặc dùng hết giới hạn thử lại mà bạn tùy ý chọn.

コメント

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