[Résolu] [DB-AL] Erreur json

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

[Résolu] [DB-AL] Erreur json

Message par maliimaloo » 31 Jan 2018 01:56

Bonjours, donc j'ai crée un System de menu Login et Enregistrement avec les fichiers json, donc mon problème viens que quand je r'entre mes données dans l'inputfield, et que je clique sur mon bouton enregistrement, le fichier prenom.json se crée mais quand je veut le remplir lors de sa création avec les données des autres inputfield, j'ai un message d'erreur qui survient :

Code : Tout sélectionner

IOException: Sharing violation on path C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\warren.json
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/FileStream.cs:320)
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share)
(wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding, Int32 bufferSize) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/StreamWriter.cs:124)
System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding)
(wrapper remoting-invoke-with-check) System.IO.StreamWriter:.ctor (string,bool,System.Text.Encoding)
System.IO.File.WriteAllText (System.String path, System.String contents, System.Text.Encoding encoding) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/File.cs:626)
System.IO.File.WriteAllText (System.String path, System.String contents) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/File.cs:621)
FonctionEnregistrement.Enregistrements () (at Assets/Script/FonctionEnregistrement.cs:43)
UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:165)
UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58)
UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()
Voici mon script :

DataController

Code : Tout sélectionner

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;

public class DataController : MonoBehaviour
{
    public static string utilisateurJsonFileName;
    public static UtilisateurStats allLoadedStats;

    // Use this for initialization
    void Start()
    {
        DontDestroyOnLoad(gameObject);

        SceneManager.LoadScene("WCFScene");

    }
    public static void LoadUtilisateurJson()
    {
        string filePath = Path.Combine(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\", utilisateurJsonFileName + ".json");

        if (File.Exists(filePath))
        {
            string dataAsJson = File.ReadAllText(filePath);

            UtilisateurStats loadedutilisateurStats = JsonUtility.FromJson<UtilisateurStats>(dataAsJson);

            allLoadedStats = loadedutilisateurStats;

            Debug.Log(dataAsJson);
        }
    }

    public static void SaveGameChapitre()
    {
        string utilisateurDataProjectFilePath = @"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + utilisateurJsonFileName + ".json";
        string saveData = JsonUtility.ToJson(allLoadedStats);
        string filePath = Application.dataPath + utilisateurDataProjectFilePath;

        File.WriteAllText(filePath, saveData);
    }
}

 [System.Serializable]
public class UtilisateurStats
{
    public string Prenom;
    public string Nom;
    public string Password;
}
Script d'enregistrement

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class FonctionEnregistrement : MonoBehaviour
{
    public InputField prenom;
    public InputField nom;
    public InputField password;

    public Text mauvaisPrenom;

    public void Enregistrements()
    {
        if (File.Exists(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json"))
        {
            mauvaisPrenom.text = "Prénom déja existant !";
        }
        else if (prenom.text == "")
        {
            mauvaisPrenom.text = "Veuillez entrer un prenom !";
        }
        else if (nom.text == "")
        {
            mauvaisPrenom.text = "Veuillez entrer un nom !";
        }
        else if (password.text == "")
        {
            mauvaisPrenom.text = "Veuillez entrer un password !";
        }
        else
        {
            File.Create(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json");

            SectionEnregistrement sectionEnregistrement = new SectionEnregistrement()
            {
                Prenom = prenom.text, Nom = nom.text, Password = password.text
            };

            string jsonSerializedObj = JsonUtility.ToJson(sectionEnregistrement);
            File.WriteAllText(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json", jsonSerializedObj);
        }
    }
}

public class SectionEnregistrement
{
    public string Prenom { get; set; }
    public string Nom { get; set; }
    public string Password { get; set; }
}
Dernière édition par maliimaloo le 06 Fév 2018 18:40, édité 1 fois.

Narkos
Messages : 46
Inscription : 15 Août 2017 10:22
Localisation : Localisation impossible

Re: [DB-AL] Erreur json

Message par Narkos » 31 Jan 2018 02:56

Salut,

Dans ton fichier d'enregistrement, tu as mis:

Code : Tout sélectionner

File.Create(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json");

            SectionEnregistrement sectionEnregistrement = new SectionEnregistrement()
            {
                Prenom = prenom.text, Nom = nom.text, Password = password.text
            };

            string jsonSerializedObj = JsonUtility.ToJson(sectionEnregistrement);
            File.WriteAllText(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json", jsonSerializedObj);
Dans ce bout de code, la 1ère ligne "File.Create(....);" ne sert à rien, car en faisant appel à "File.WriteAllText(...)" cela crée un nouveau fichier, écrit le contenu dans le fichier, puis ferme le fichier. Si le fichier cible existe déjà, il est remplacé.

Après en regardant le log de l'erreur, on dirait que lors de l'appel à "File.WriteAllText(...)" le fichier est locké, retire la ligne de code avec le "File.Create" comme dit plus haut et regarde si t'as toujours l'erreur.

( Si tu veux vraiment garder la 1ère ligne "File.Create(...);" ça devrait fonctionner en ajoutant ".Dispose();" comme ceci: )

Code : Tout sélectionner

File.Create(@"C:\Users\Maliimaloo\Documents\CréationC#\WCFUnity\Assets\ListeJson\" + prenom.text + ".json").Dispose();
Bon dév!

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [DB-AL] Erreur json

Message par maliimaloo » 31 Jan 2018 03:12

Cela fonctionne je n'ai plus l'erreur en enlevant la ligne ou quand je mets .Dispose(), cela me crée bien le fichier, mais il est vide, il n'est pas rempli par ce que je voulais .

C'est bon j'ai réussi, je te dis un grand merci car tu m'as vraiment aidé, car je chercher sur le internet je ne trouvais pas et pour mon petit problème que sa ne l'écrivait pas, c'est que je crée une nouvelle classe avec Prénom nom Password dans mon script "FonctionEnregistrement" et que je ne l'ai pas [System. Serializable] donc faut que j'utilise ma class "UtilistaeurStats" définie dans script "DataController" qui est déjà [System. Serializable] est utiliser pour charger mon json.

Je supprime :

Code : Tout sélectionner

public class SectionEnregistrement
{
    public string Prenom { get; set; }
    public string Nom { get; set; }
    public string Password { get; set; }
}
et je remplace

Code : Tout sélectionner

 SectionEnregistrement sectionEnregistrement = new SectionEnregistrement()
            {
                Prenom = prenom.text, Nom = nom.text, Password = password.text
            };
par :

Code : Tout sélectionner

UtilisateurStats sectionEnregistrement = new UtilisateurStats()
            {
                Prenom = prenom.text, Nom = nom.text, Password = password.text
            };

Narkos
Messages : 46
Inscription : 15 Août 2017 10:22
Localisation : Localisation impossible

Re: [DB-AL] Erreur json

Message par Narkos » 31 Jan 2018 04:00

Re,

Contant d'avoir pu t'aider ;)

Par contre si je peux me permettre une remarque, penses à éviter de stocker des password en clair... c'est pas super pour la sécu.
Tu peux utiliser un truc du genre:

Code : Tout sélectionner

byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + inputString + salt);
data = new System.Security.Cryptography.SHA256Managed().ComputeHash(data);
String hash = System.Text.Encoding.ASCII.GetString(data);
Bon dév!

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [DB-AL] Erreur json

Message par maliimaloo » 31 Jan 2018 09:38

Je te remercie, mais tinquiète la c'est juste un test afin de savoir si je peut crée un service web (WCF) via unity, qui est un franc succès d'ailleurs :p

PS : Comment incorporer ton system pour écrire le password en crypter dans mon json, car pour ne pas mentir quand l'on me passe des bouts de code que je connait pas, j'arrive très rarement à l'incorporer à mon code :p

Narkos
Messages : 46
Inscription : 15 Août 2017 10:22
Localisation : Localisation impossible

Re: [DB-AL] Erreur json

Message par Narkos » 31 Jan 2018 13:35

Salut,

Aucun soucis ;)
Voici une implémentation possible:
- Dans ta classe d'enregistrement, ajoute cette méthode:

Code : Tout sélectionner

public string EncryptString(string inputString)
    {
        // On défini un grain de sel (ça sert à renforcer un peu la sécu en compliquant encore un peu le hash)
        string salt = "defini_le_sel_que_tu_veux";

        // On récupères les bytes de la chaine de caractères
        byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + inputString + salt);
        // Là on encrypte les bytes de la chaine
        data = new System.Security.Cryptography.SHA256Managed().ComputeHash(data);
        // On récupère la chaine finale
        return System.Text.Encoding.ASCII.GetString(data);
    }
Ensuite remplace:

Code : Tout sélectionner

UtilisateurStats sectionEnregistrement = new UtilisateurStats()
            {
                Prenom = prenom.text, Nom = nom.text, Password = password.text
            };
Par:

Code : Tout sélectionner

UtilisateurStats sectionEnregistrement = new UtilisateurStats()
            {
                Prenom = prenom.text, Nom = nom.text, Password = this.EncryptString(password.text);
            };
Dans la méthode que je t'ai donné, il faut modifier le contenu de la variable "salt" avec le string que t'as envie, puis dès le moment que t'as encrypté un password, il ne faut plus changer la variable salt sinon le password ne matchera plus.

Bon dév!

Narkos
Messages : 46
Inscription : 15 Août 2017 10:22
Localisation : Localisation impossible

Re: [DB-AL] Erreur json

Message par Narkos » 02 Fév 2018 04:59

Au passage si ton problème est réglé n'hésite pas à passer ton sujet en [Résolu] ::d

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [DB-AL] Erreur json

Message par maliimaloo » 06 Fév 2018 18:36

Niquel, je désoler de répondre un peut tard, j'étais occuper, du coup ton System fonctionne niquel, et mon problème est résolu, donc je te remercie beaucoup car tu ma apprit un nouveau truck le cryptage du mot de passe qui est fort utile d'ailleurs :p

Répondre

Revenir vers « (C#) CSharp »