C# le processus ne peut pas accéder au fichier "' parce qu'il est utilisé par un autre processus

le fragment de code était juste supposé écrire une chaîne dans un fichier texte appelé" all_results.txt". J'ai eu des erreurs d'exécution dans le Fichier.WriteAllText. Après avoir cherché des solutions sur le net, J'ai essayé D'utiliser FileStream et StreamWriter comme substituts. Le problème persiste encore.

il m'a donné:

IOException non Gérée: Le processus ne peut pas accéder au fichier 'C:UsersMadDebaterDesktopConsoleTest1ConsoleTestbinDebugall_results.txt' car il est utilisé par un autre processus.

étrangement, les erreurs se produisent arbitrairement. Il peut s'agir de la 3e boucle, ou de la 45e boucle avant qu'elle ne touche une erreur. J'ai fourni le code complet pour cette classe au cas où le problème serait plus profond qu'il n'y paraît. Je suis sûr que ça n'a rien à voir avec mon scanner de virus ou quelque chose comme ça.

try
                {
                    using (FileStream stream = new FileStream(@"all_results.txt", FileMode.Create)) // Exception here
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.WriteLine(result);
                        writer.Dispose();
                        writer.Close();
                    }

                    stream.Dispose();
                    stream.Close();
                }

                }
                catch (IOException ex)
                {
                    Console.WriteLine(ex);
                }

même si j'essaie ça, ça ne marche pas.

try
                {
                    File.WriteAllText(@"all_results.txt", result); // Exception here
                }
                catch (IOException ex)
                {
                    Console.WriteLine(ex.Message);
                }

ci-dessous est le code complet pour le classe. Il est destiné à prendre dans une liste de tweets Twitter et de les classer en utilisant Bayes Classification un par un.

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using BayesClassifier;
    using System.Text.RegularExpressions;

    namespace ConsoleTest
    {
        class Analyzer
        {
            public static void Analyzing(List<string> all_results)
            {

            Reducting(all_results);
            Classifying();
        }

        public static void Reducting(List<string> all_results)
        {
            //Reductor
            //Precondition: List<string> results
            all_results.ForEach(delegate(String text)
            {

                const string ScreenNamePattern = @"@([A-Za-z0-9-_&;]+)";
                const string HashTagPattern = @"#([A-Za-z0-9-_&;]+)";
                const string HyperLinkPattern = @"(http://S+)s?";
                string result = text;

                if (result.Contains("http://"))
                {
                    var links = new List<string>();
                    foreach (Match match in Regex.Matches(result, HyperLinkPattern))
                    {
                        var url = match.Groups[1].Value;
                        if (!links.Contains(url))
                        {
                            links.Add(url);
                            result = result.Replace(url, String.Format(""));
                        }
                    }
                }

                if (result.Contains("@"))
                {
                    var names = new List<string>();
                    foreach (Match match in Regex.Matches(result, ScreenNamePattern))
                    {
                        var screenName = match.Groups[1].Value;
                        if (!names.Contains(screenName))
                        {
                            names.Add(screenName);
                            result = result.Replace("@" + screenName,
                               String.Format(""));
                        }
                    }
                }

                if (result.Contains("#"))
                {
                    var names = new List<string>();
                    foreach (Match match in Regex.Matches(result, HashTagPattern))
                    {
                        var hashTag = match.Groups[1].Value;
                        if (!names.Contains(hashTag))
                        {
                            names.Add(hashTag);
                            result = result.Replace("#" + hashTag,
                               String.Format(""));
                        }
                    }
                }

                // Write into text file
/*
                try
                {
                    using (FileStream stream = new FileStream(@"all_results.txt", FileMode.Create)) // Exception here
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.WriteLine(result);
                        writer.Dispose();
                        writer.Close();
                    }

                    stream.Dispose();
                    stream.Close();
                }

                }
                catch (IOException ex)
                {
                    Console.WriteLine(ex);
                }
                */
                try
                {
                    File.WriteAllText(@"all_results.txt", result); // Exception here
                }
                catch (IOException ex)
                {
                    Console.WriteLine(ex.Message);
                }

            });
        }

        public static void Classifying()
        {
            // Classifying

            BayesClassifier.Classifier m_Classifier = new BayesClassifier.Classifier();


            m_Classifier.TeachCategory("Positive", new System.IO.StreamReader("POSfile.txt"));
            m_Classifier.TeachCategory("Negative", new System.IO.StreamReader("NEGfile.txt"));

            Dictionary<string, double> newscore;
            newscore = m_Classifier.Classify(new System.IO.StreamReader("all_results.txt"));

            PrintResults(newscore);
}

        public static void PrintResults(Dictionary<string, double> newscore)
        {
            foreach (KeyValuePair<string, double> p in newscore)
            {
                Console.WriteLine(p.Key + ", " + p.Value);
            }

            List<string> list = new List<string>();
            using (StreamReader reader = new StreamReader("all_results.txt"))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    list.Add(line);          // Add to list.
                    Console.WriteLine(line); // Write to console.

                }

                reader.Close();
            }

            //PrintSentiment(newscore);
        }

        public static void PrintSentiment(Dictionary<string, double> newscore)
        {

            // if difference < 2, neutral
            // if neg < pos, pos
            // if pos < neg, neg

            double pos = newscore["Positive"];
            double neg = newscore["Negative"];
            string sentiment = "";

            if (Math.Abs(pos - neg) < 1.03)
            {
                sentiment = "NEUTRAL";
            }
            else
            {
                if (neg < pos)
                {
                    sentiment = "POSITIVE";
                }
                else if (pos < neg)
                {
                    sentiment = "NEGATIVE";
                }
            }

            Console.WriteLine(sentiment);


            // append tweet_collection to final_results <string> list
            // append sentiment tag to the final_results <string> list
            // recursive
        }
    }
}
2
demandé sur youngscientist 2010-09-27 16:50:40

10 réponses

Dont call Dispose() Et Close() sur le FileStream et StreamWriter, ceci sera traité automatiquement par la clause using.

3
répondu Marcus 2010-09-27 13:42:04

utilisez un utilitaire comme filemon pour vérifier quels processus utilisent le fichier.

mise à JOUR: D'après ce que j'ai lu, Process monitor ressemble beaucoup à filemon. à partir de l'un ou l'autre de ces outils, vous pouvez trouver quel processus a accédé à votre fichier à quel moment. vous pouvez ajouter un filtre pour votre fichier avant de commencer la surveillance.

l'autre chose que vous pouvez essayer est de verrouiller le fichier s'il existe.

2
répondu Vinay B R 2010-09-27 14:50:10

peut-être que le fichier est accédé par un scanner de virus ou le service d'indexation de windows?

1
répondu elsni 2010-09-27 12:54:37

Essayez d'écrire le fichier dans un autre répertoire en dehors du dossier de débogage.

0
répondu kjn 2010-09-27 12:56:53

Juste un "tir sauvage" - t-il de l'aide si vous placez le fichier dans un plus prévisible, comme 'c:\all_results.txt'?

0
répondu Maate 2010-09-27 12:57:03

essayez de mettre du fil.Sommeil(1000) dans votre boucle. Comme quelqu'un mentionné ci-dessus, le fichier n'est pas toujours publié à temps pour la prochaine itération de la boucle.

0
répondu xbonez 2010-09-27 13:05:39

comme d'autres l'ont déclaré, l'ouverture et la fermeture répétées du dossier pourraient être la question. Une solution non mentionnée est de garder le fichier ouvert pendant la durée du traitement. Une fois terminé, le dossier peut être fermé.

0
répondu Pedro 2010-09-27 13:51:53

Pedro:

comme d'autres l'ont déclaré, l'ouverture et la fermeture répétées du dossier pourraient être la question. Une solution non mentionnée est de garder le fichier ouvert pendant la durée du traitement. Une fois terminé, le dossier peut être fermé.

ou, alternativement, recueillez votre texte dans un fichier StringBuilder ou un autre stockage de texte en mémoire et ensuite déchargez le texte dans le fichier une fois la boucle terminée.

0
répondu bugventure 2010-09-27 17:36:44

j'ai trouvé le post alors que j'avais le même problème. Les conseils donnés m'ont donné une idée! Donc pour cela j'ai écrit la méthode suivante

public static void ExecuteWithFailOver(Action toDo, string fileName)
{

    for (var i = 1; i <= MaxAttempts; i++)
    {
        try
        {
            toDo();

            return;
        }
        catch (IOException ex)
        {
            Logger.Warn("File IO operation is failed. (File name: {0}, Reason: {1})", fileName, ex.Message);
            Logger.Warn("Repeat in {0} milliseconds.", i * 500);

            if (i < MaxAttempts)
                Thread.Sleep(500 * i);
        }
    }

    throw new IOException(string.Format(CultureInfo.InvariantCulture,
                                        "Failed to process file. (File name: {0})",
                                        fileName));

}

puis j'ai utilisé la méthode de la manière suivante

    Action toDo = () =>
                   {
                       if (File.Exists(fileName))
                           File.SetAttributes(fileName, FileAttributes.Normal);

                       File.WriteAllText(
                           fileName,
                           content,
                           Encoding.UTF8
                           );
                   };

    ExecuteWithFailOver(toDo, fileName);

plus tard, en analysant les logs, j'ai découvert que la raison de mes problèmes était une tentative d'agir contre le même fichier à partir des threads parallèles. Mais je vois encore quelques pro-s dans l'utilisation de la méthode de basculement suggéré

0
répondu Yaugen Vlasau 2013-09-13 12:20:49

essayez d'utiliser lock autour de vos opérations de fichier. http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

0
répondu Mr W 2014-04-11 08:14:26