web-dev-qa-db-fra.com

Partage de la violation IOException lors de la lecture et de l'écriture dans le fichier C #

Voici mon code:

public static TextWriter twLog = null;
private int fileNo = 1;
private string line = null;

TextReader tr = new StreamReader("file_no.txt");
TextWriter tw = new StreamWriter("file_no.txt");
line = tr.ReadLine();
if(line != null){
    fileNo = int.Parse(line);
    twLog = new StreamWriter("log_" + line + ".txt");
}else{
    twLog = new StreamWriter("log_" + fileNo.toString() + ".txt");  
}
System.IO.File.WriteAllText("file_no.txt",string.Empty);
tw.WriteLine((fileNo++).ToString());
tr.Close();
tw.Close();
twLog.Close();

Il jette cette erreur:

IOException: violation de partage sur le chemin C:\Users\Water Simulation\no_fichier.txt

Ce que j'essaie de faire, c'est d'ouvrir un fichier portant le nom log_x.txt et de prendre le "x" du fichier no_fichier.txt. Si le fichier no_type.txt est vide, le nom du fichier journal est log_1.txt. Après le démarrage d'un nouveau programme, le nouveau nom du fichier journal doit être log_2.txt.Mais je reçois cette erreur et je ne comprenais pas ce que je faisais mal. Merci de l'aide.

19
Ozg

Eh bien, vous essayez d’ouvrir le fichier file_no.txt pour lire et en écriture en utilisant des flux séparés. Cela risque de ne pas fonctionner car le fichier sera verrouillé par le flux de lecture. Par conséquent, le flux d'écriture ne peut pas être créé et vous obtenez l'exception.

Une solution serait de lire le fichier en premier, de fermer le flux, puis d’écrire le fichier après l’augmentation de fileNo. Ainsi, le fichier n’est ouvert qu’une fois à la fois.

Une autre solution consisterait à créer un flux de fichiers pour les accès en lecture et en écriture de la manière suivante:

FileStream fileStream = new FileStream(@"file_no.txt", 
                                       FileMode.OpenOrCreate, 
                                       FileAccess.ReadWrite, 
                                       FileShare.None);

La réponse acceptée à cette question semble avoir une bonne solution également, même si je suppose que vous ne souhaitez pas autoriser les lectures partagées.

Solution alternative possible
Je comprends que vous souhaitiez créer des fichiers journaux uniques au démarrage de votre programme. Une autre façon de le faire serait la suivante:

int logFileNo = 1;
string fileName = String.Format("log_{0}.txt", logFileNo);

while (File.Exists(fileName))
{
    logFileNo++;
    fileName = String.Format("log_{0}.txt", logFileNo);
}

Cela augmente le nombre jusqu'à ce qu'il trouve un numéro de fichier où le fichier journal n'existe pas. Inconvénient: Si vous avez log_1.txt et log_5.txt, le fichier suivant ne sera pas log_6.txt mais log_2.txt

Pour résoudre ce problème, vous pouvez énumérer tous les fichiers de votre répertoire avec mask log_*.txt et trouver le plus grand nombre en effectuant des manipulations de chaîne.

Les possibilités sont infinies :-D

21
Thorsten Dittmar

C'est peut-être vieux, mais la réponse acceptée ne m'a pas aidé. Cela est dû au fait que vous essayez de lire ou d'écrire un fichier que vous venez de créer à partir d'un flux séparé. La solution est très simple. Il vous suffit de disposer du flux de fichiers que vous avez utilisé pour le créer et d'accéder ensuite librement au fichier.

if (!File.Exists(myfile))
{
    var fs = new FileStream(fav, FileMode.Create);
    fs.Dispose();
    string text = File.ReadAllText(myfile);
}
1
Prince Tegaton

entrez la description de l'image ici

         var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create);

        resizedBitmap.Compress(Bitmap.CompressFormat.Png, 200, stream); //problem here
        stream.Close();
        return resizedBitmap;

Dans la méthode Compress, je passais la valeur du paramètre quality à 200, ce qui malheureusement n'autorise pas les valeurs situées en dehors de la plage 0-100.

J'ai rétabli la valeur de qualité à 100 et le problème a été résolu.

0
clumsycoder