Comment lire en continu les images du dossier source ?

la programmation


Mon programme comprend les étapes suivantes :
1. lire toute nouvelle image à partir d’un dossier source
2. traiter l’image (détecter les objets et les redresser)
3. enregistrez les images d’objets redressées dans un dossier cible
…répéter

L’idée est que lors de la numérisation des tampons, le programme génère chaque tampon individuellement ou groupé si les tampons sont regroupés. L’utilisateur doit pouvoir effectuer des analyses en continu pendant leur traitement.

Le programme se comporte de trois manières distinctes, basées sur trois manières de détecter de nouvelles images dans le dossier cible. En pratique, seule la troisième voie sera utilisée. Nous espérons que les deux premiers aideront à expliquer ce qui se passe et pourquoi.

1. Glisser-déposer
Tout fonctionne correctement lorsque vous faites glisser et déposez manuellement une image dans le dossier ; Je peux le faire indéfiniment et les sorties sont correctes.

2. Copier-coller
Lorsque vous copiez et collez une image localement dans le dossier cible, le programme s’arrête immédiatement, affichant l’exception suivante :

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

Cette même exception se produit lors du copier-coller d’images dans le dossier cible.

3. Sortie du programme de numérisation
J’utilise le ScanSnap SV600 qui enregistre les numérisations non traitées des tampons dans le dossier cible. Voici maintenant le cas qui me laisse perplexe : mon programme de traitement alterne dans son comportement. La première analyse réussit toujours à chaque fois que je démarre le programme en mode débogage. Mais la lecture lors de l’analyse suivante au cours de la même exécution du programme de traitement échoue dans le cas où la session de débogage précédente a réussi. Autrement dit : une fois sur deux, le programme se comporte comme souhaité. Et les autres fois, il s’arrête lors de la deuxième analyse, me donnant l’erreur ci-dessus.

Pour détecter de nouvelles images, j’utilise :

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

Ce que j’ai essayé :

De plus, cela fait partie du code avant le début du traitement. Ce n’est pas le plus beau et semble un peu « hacky » en utilisant `Thread.Sleep()`. Peut-être voici un indice ?

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

Solution 1

C’est simple. Vous essayez de lire le fichier avant que le processus de copie ne soit terminé et fermé.

Il vous suffit d’ESSAYER d’ouvrir le fichier. S’il génère une exception parce qu’il est déjà utilisé, attendez un peu et réessayez. Continuez à essayer jusqu’à ce que vous ouvriez le fichier ou que vous ayez épuisé la limite de tentatives que vous avez choisie arbitrairement.

コメント

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