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.
4 Réponses :
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);
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 .Disposeméthode:File.WriteAllText(path, myText);
estimer le temps qu'il faudra pour le faire
Vous pouvez utiliser
System .Diagnostics.Stopwatchpour faire cela:Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); /* do the magic */ stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds);
Vous pouvez utiliserFile.WriteAllText code >au lieu deFile.CreateTextpour é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
Listaussi au lieu d'une chaîne.
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:
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,
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.
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);
}
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
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.