2
votes

Comment puis-je écrire dans un fichier et supprimer le fichier par la suite en C #?

J'ai besoin de créer un fichier, d'écrire une ligne de texte dans le fichier, puis de supprimer le fichier et d'estimer le temps qu'il faudra pour le faire.

Malheureusement, j'exécute dans quelques problèmes, d'abord je ne peux pas écrit dans le fichier, il le crée avec succès mais rien n'y est écrit.

Deuxièmement, je ne peux pas supprimer le fichier car il a été utilisé par un autre processus.

Veuillez aider.

J'essaye de le supprimer depuis un certain temps.

J'ai également essayé de l'encapsuler dans des utilisations, en vain.

L'écriture dans le fichier est la même situation. Je l'ai même changé pour que le fichier se termine par .txt mais cela ne fait aucune différence.

        public static void ProcessFile(string path)
        {
        string fullpath = path;
        int lastBracket = path.LastIndexOf("\\");
        // the filename does not contain .html so it can be named to .txt
        string newFileName = path.Substring(lastBracket + 1, path.Length - lastBracket - 6) + " hrefcount.txt";
        string newPath = Path.Combine(fullpath.Substring(0, lastBracket), newFileName);
        Console.WriteLine(newPath);
        int counter = 0;
            foreach (var line in File.ReadAllLines(path))
            {
                if (line.Contains("href="))
                {
                counter++;
                }
            }

        var fileCreated = File.CreateText(newPath);
        fileCreated.WriteLine("The number of times href appears is " + counter);
        Console.WriteLine();
        File.Delete(newPath);
    }

Fichier créé, rien d'écrit dessus, impossible de supprimer car a été utilisé par un autre processus.


2 commentaires

Vous devez fermer et supprimer fileCreated avant d'essayer de supprimer le fichier maintenu ouvert par ce FileStream


File.WriteAllText serait probablement une meilleure alternative que File.CreateText.


4 Réponses :


3
votes

Au lieu de File.CreateText () , utilisez File.WriteAllText (chemin, contenu) . Il écrit le texte puis ferme le fichier vous permettant de le supprimer si nécessaire

Au lieu de ce qui suit

File.WriteAllText(newPath, $"The number of times href appears is {counter}");

Vous pouvez écrire

var fileCreated = File.CreateText(newPath);
fileCreated.WriteLine("The number of times href appears is " + counter);


0 commentaires

1
votes

Je ne peux pas supprimer le fichier car il a été utilisé par un autre processus.

Vous n'avez probablement pas supprimé vos fichiers après la création. Pour ce faire, vous devez en plus utiliser FileStream .Dispose méthode:

File.WriteAllText(path, myText);


estimer le temps qu'il faudra pour le faire

Vous pouvez utiliser System .Diagnostics.Stopwatch pour faire cela:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
/*
   do the magic
*/
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);


Vous pouvez utiliser File.WriteAllText code > au lieu de File.CreateText pour écrire votre texte dans un fichier:

File.Create(path).Dispose();

N'oubliez pas que depuis le .NET 4, vous pouvez utiliser cette méthode avec array ou List aussi au lieu d'une chaîne.


0 commentaires

1
votes

File.Create () prend en charge la méthode Dispose qui vous aide à libérer cette ressource de fichier pour effectuer d'autres opérations

Pour effectuer des opérations sur le fichier, suivez les étapes ci-dessous:

  1. Créez un fichier et libérez la ressource en utilisant Dispose () .

    File.Create(newPath).Dispose();

ou utilisez StreamWriter pour créer un fichier et y écrire du texte.

using( StreamWriter sw = new StreamWriter(newPath, true)
{
   sw.Write($"The number of times href appears is {counter}"); //Used string interpolation 
}

StreamWriter appelle Dispose () pour libérer la ressource de fichier.

Lorsque Writer libère le contrôle du fichier, vous ne rencontrerez pas de problème lié à Je ne peux pas supprimer le fichier car il a été utilisé par un autre processus.

Vous pouvez maintenant supprimer le fichier en utilisant,

  1. File.Delete (newPath);

MSDN: Méthode IDisposable.Dispose

Effectue les tâches définies par l'application associées à la libération, la libération, ou réinitialiser les ressources non gérées.


0 commentaires

1
votes

La cause de votre erreur est le fait que vous ne fermez pas et ne supprimez pas la variable fileCreated . Ceci est un FileStream et jusqu'à ce que vous fermiez et supprimiez cette variable, le fichier n'est accessible à personne, même à votre propre code qui a ouvert le fichier.

La première chose à faire est donc

public static void ProcessFile(string path)
{
    string folder = Path.GetDirectoryName(path);
    string file = Path.GetFileName(path);


    // Keep the first 6 characters from the source file?
    string newFile = file.Substring(0, 6) + " hrefcount.txt";
    string newPath = Path.Combine(folder, newFile);

    // A single line to retrieve your counter thanks to IEnumerables and Linq
    int counter = File.ReadLines(path).Count(x => x.Contains("href="));

    // Create, but dispose also the file
    using (var fileCreated = File.CreateText(newPath))
    {
        fileCreated.WriteLine("The number of times href appears is " + counter);
    }

    // Now you should be free to delete the file
    File.Delete(newPath);
}


2 commentaires

Merci Steve. Pour moi, il n'est pas seulement important de résoudre le problème, mais de l'optimiser, car demain ce serait mon travail. C'est pourquoi j'ai choisi la vôtre pour une meilleure réponse.


Merci d'avoir apprécié mes efforts. Dans ma réponse, je n'ai pas inclus les conseils d'utilisation de File.WriteAllText mais aussi ce point est utile pour améliorer la lisibilité du code