IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mono .NET Discussion :

[C#/mono] File.Create, Sharing violation?


Sujet :

Mono .NET

  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut [C#/mono] File.Create, Sharing violation?
    Bonjour à tous,

    J'écris une petite application pour recenser le contenu de mes dvd de données.
    J'utilise pour ce faire un simple fichier texte et un affichage dans un treeview.

    Au lancement de l'application, elle vérifie si le fichier texte existe. S'il n'existe pas, j'utilise file.create pour créer le fichier.

    Mon problème est que lors de mon premier lancement, le fichier est bien créer mais je ne peux y ajouter de texte immédiatement. Si je tente un ajout immédiat, j'ai un message d'erreur (mon premier catch) dont la première phrase est:
    System.IO.IOException: Sharing violation on path /home/shaika-dzari/.AI.db
    Je dois fermer l'application et l'ouvrir de nouveau et là je peux ajouter normallement.

    Voici mon code au départ de l'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    protected void DataReading()
    {
    	// Variables nécessaires
    	StreamReader sr = null;
    	StreamWriter sw = null;
     
    	string Line ="";
    	// Nettoyage préalable du treeview
    	AnimeDB.Clear();
    	// Lecture ou création du fichier texte
    	try{
    		if (!File.Exists(m_Conf)){
    			File.Create(m_Conf);
    		}
    		else{
    			sr = new StreamReader(m_Conf);
    			while ((Line = sr.ReadLine()) != null){
    				AnimeDB.AppendValues(Line, sr.ReadLine());
    			}
    		}
    	}
    	// Erreur au chargement avec dialog
    	catch (Exception EX){
    		MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,MessageType.Error, 
    			                                         ButtonsType.Close, "Erreur de Chargement des données!\r\n\r\n"+EX.ToString());
    		md.Run();
    		md.Destroy();
    	}
    	finally{
    		if (sw != null) sw.Close();
    		if (sr != null) sr.Close();
    	}		
    }
    Voici mon code pour ajouter une entrée dans le fichier texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    protected virtual void btnAdd_Click(object sender, System.EventArgs e)
    	{
    		// Variables nécessaires
    		StreamWriter sw = null;
     
    		// Vérification des champs à ajouter
    		if (txtNom.Text == "" || txtNoDVD.Text == ""){
    			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,MessageType.Error, 
    			                                         ButtonsType.Close, "Veuillez remplir les deux champs\n\rpour ajouter une entrée.");
    			md.Run();
    			md.Destroy();
    			return;
    		}
    		// Si valide, on ajoute l'entrée
    		try{
    			// Copie du fichier existant...sécurité
    			File.Copy(m_Conf, m_Confsave, true);
    			// Ajout au fichier texte
    			sw = File.AppendText(m_Conf);
    			sw.WriteLine(txtNom.Text);
    			sw.WriteLine(txtNoDVD.Text);
    		}
    		catch (Exception EX){
    			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,MessageType.Error, 
    			                                         ButtonsType.Close, "Erreur d'écriture des données!\r\n\r\n"+EX.ToString());
    			md.Run();
    			md.Destroy();
    		}
    		finally{
    			if (sw != null) sw.Close();
    		}
    		DataReading();
    	}
    Il est à noter que l'exception lever se situe dans ma première fonction.
    Dois-je libéré d'une manière quelquonque les ressource après un File.Create ou lui passer un Filemode ?

    Merci de votre aide!

    @+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Perso je passerai par la classe FileStream pour effectue la mnipulation du fichier.
    Exemple:

    FileStream file ;
    if (!File.Exists(m_Conf)){
    file = File.Create(m_Conf);
    }


    Et apres tu manipule file pour effectue ta lecture ou ton ecriture en faisant attention que ton fichier est bien ouvert.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Bonjour,

    Je vais tenter la manoeuvre à l'aide d'un filestream et je reviens donner des nouvelles.

    Merci de ton aide gcorbineau.

    @+

  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Salut,

    pas la peine de verifie l'existence du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FileStream fichier = File.Open("file.txt",FileMode.OpenOrCreate,FileAccess.Write);
    StreamWriter writer = new StreamWriter(fichier);
    writer.WriteLine("Yellow World");
    writer.Close();
    fichier.Close();
    Edit: Desolé j'ai oublié la suite

  5. #5
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par défaut
    Bonjour à tous!

    La piste du filestream était la bonne!

    Il semble que lors d'un simple file.create comme ma méthode le fichier ne soit pas libéré.

    J'ai donc simplement fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    protected void DataReading()
    	{
    		// Variables nécessaires
    		StreamReader sr = null;
    		FileStream fs = null;
    		string Line ="";
    		// Nettoyage préalable du treeview
    		AnimeDB.Clear();
    		// Lecture ou création du fichier texte
    		try{
    			if (!File.Exists(m_Conf)){
    				fs = File.Create(m_Conf);
    			}
    			else{
    				sr = new StreamReader(m_Conf);
    				while ((Line = sr.ReadLine()) != null){
    					AnimeDB.AppendValues(Line, sr.ReadLine());
    				}
    			}
    		}
    		// Erreur au chargement avec dialog
    		catch (Exception EX){
    			MessageDialog md = new MessageDialog (null,DialogFlags.DestroyWithParent,MessageType.Error, 
    			                                         ButtonsType.Close, "Erreur de Chargement des données!\r\n\r\n"+EX.ToString());
    			md.Run();
    			md.Destroy();
    		}
    		finally{
    			if (sr != null) sr.Close();
    			if (fs != null) fs.Close();
    		}		
    	}
    Merci de votre aide à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/06/2012, 14h39
  2. [Ressources biblio] Convert files created using an ODS destination to native Excel files
    Par datametric dans le forum Contribuez
    Réponses: 0
    Dernier message: 03/10/2011, 21h20
  3. Réponses: 4
    Dernier message: 21/11/2005, 12h04
  4. [PPC][C#] File sharing et SqlNullValue exception
    Par Roach dans le forum Windows Forms
    Réponses: 28
    Dernier message: 12/10/2005, 17h40
  5. [VCL] TImage.Create(AOwner) renvoie une Violation d'accès
    Par prgasp77 dans le forum Composants VCL
    Réponses: 10
    Dernier message: 23/01/2005, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo