2 votes

C# - StreamReader/StreamWriter - Fichier utilisé par un autre processus

Tout d'abord, je me suis assuré que je disposais et fermais tout (à la fois le lecteur et l'écrivain) correctement. La méthode que j'utilise est celle de l'instruction using ; et avant cela, j'utilisais manuellement la méthode dispose and close fournie par le rédacteur et le lecteur. Ces deux méthodes ne résoudront pas le problème. Deuxièmement, aussi le point que je soupçonne, je traite beaucoup de fichiers à la fois en lecture et en écriture. De plus, à chaque fois que j'exécute le programme, celui-ci s'enfonce davantage dans la liste des fichiers qui sont censés être traités (par exemple, j'ai 10 fichiers, la première fois que j'exécute le programme, il traitera les 2 premiers avant de lancer l'erreur ; la deuxième fois que j'exécute le programme, il traitera les 5 premiers avant de lancer l'erreur et ainsi de suite). Alors, comment suis-je censé résoudre ce problème/bogue ? Merci d'avance !

Edit - Code joint

    public static void FileProcessing(string initPath, string targetPath, string startLine)
    {
        string line = null;
        string content = null;
        string nl = "\r\n";
        using (StreamReader reader = new StreamReader(initPath))
        {
            while (!reader.ReadLine().Contains(startLine)) ;

            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                // Ignore empty line.
                if (line.Length > 0)
                {
                    if (!line.Contains("<div"))
                        content += line += nl;
                    else
                        break;
                }
            }
        }

        using (StreamWriter writer = new StreamWriter(targetPath))
        {
            writer.Write(content.Trim());
        }
    }

    /// <summary>
    /// Create a temporary text file that correspond to the calendar department page
    /// and return the path.
    /// </summary>
    public static string CreateFile(string path, string title)
    {
        string npath = path + title + ".txt";
        if (!File.Exists(npath))
            File.CreateText(npath);
        return npath;
    }

    /// <summary>
    /// Return the title of the page.
    /// </summary>
    /// <param name="path"></param>
    public static string GetTitle(string path)
    {
        string line;
        using (StreamReader reader = new StreamReader(path))
        {
            for (int i = 0; i < 31; ++i)
            {
                line = reader.ReadLine();
                // Ignore empty line.
                if (line.Length > 0)
                {
                    if (line.Contains("<h1>"))
                    {
                        return line.Slice(4, -5);
                    }
                }
            }
            return "null";
        }
    }

    /// <summary>
    /// Get content from temp path and
    /// output the processed text to destination path.
    /// </summary>
    /// <param name="tempPath"></param>
    /// <param name="title"></param>
    public static void WriteProcessedText(string tempPath, string targetPath)
    {
        string content = null;
        using (StreamReader reader = new StreamReader(tempPath))
        {
            string nl = "\r\n";
            string line = null;
            while (!reader.EndOfStream)
            {
                line = HtmlRemoval.StripTagsRegex(reader.ReadLine()) + nl;
                if (line.Contains("&nbsp;"))
                    line = line.Replace("&nbsp;", " ");
                content += line;
            }
        }

        using (StreamWriter writer = new StreamWriter(targetPath))
        {
            writer.Write(content.Trim());
        }
    }

2voto

I4V Points 23648

File.CreateText(npath) crée non seulement le nom de fichier sur le disque mais l'ouvre également. Donc, soit vous le fermez dans votre CreateFile ou la modifier pour qu'elle renvoie un flux.

public static string CreateFile(string path, string title)
{
    string npath = path + title + ".txt";
    if (!File.Exists(npath))
        File.CreateText(npath); //<-- File is not closed !!!
    return npath;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X