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

C# Discussion :

Protéger accès à un fichier [Débutant]


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 456
    Points : 384
    Points
    384
    Par défaut Protéger accès à un fichier
    Bonjour

    Comment peut-on protéger l'accès à un fichier qui sera partagé entre plus de 300 applications qui peuvent faire lecture et écriture
    dans les specs que j'ai eu , il faut sauvegarder une variable dans un fichier et le récupérer à chaque appel d'une méthode et ajouter la variable de 1 à chaque appel .

    j'ai essayé de faire le code suivant , mais il ne marche pas

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
          static ReaderWriterLockSlim rw = new ReaderWriterLockSlim();
            static int n; 
            static void RW()
            {
                rw.EnterReadLock();            
                StreamReader sr = File.OpenText("test.txt");
                 n = int.Parse(sr.ReadLine());
                sr.Close();
                n++;
                rw.ExitReadLock();
                rw.EnterWriteLock();
                StreamWriter sw=File.CreateText("test.txt");
                sw.WriteLine(n.ToString());
                sw.Close();
                rw.ExitWriteLock();
     
     
            }
     
            static void Main()
            {
                Thread t1 = new Thread(new ThreadStart(RW));
                Thread t2 = new Thread(new ThreadStart(RW));
                Thread t3 = new Thread(new ThreadStart(RW));
                Thread t4 = new Thread(new ThreadStart(RW));
                Thread t5 = new Thread(new ThreadStart(RW));
                Thread t6 = new Thread(new ThreadStart(RW));
                t1.Start();
                t2.Start();
                t3.Start();
                t4.Start();
                t5.Start();
                t6.Start();
     
                t1.Join();
                t2.Join();
                t3.Join();
                t4.Join();
                t5.Join();
                t6.Join();
                Console.WriteLine("fin");            
                Console.ReadLine();
            }
    est-ce que vous avez des idées ?

    Merci par avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Si j'ai bien compris ce que vous vouliez faire, alors un ReadWriterLockSlim ne sera d'aucune utilité dans ce cas.

    Pour ouvrir un fichier en spécifiant le fait qu'aucun autre processus ne doit écrire dedans en même temps, il faut l'ouvrir avec la classe FileStream, et tout particulièrement avec ce constructeur. Dans ce constructeur dont je vous ai passé le lien, il y a le paramètre "share" qui vous permettra de spécifier quels sont les droits d'accès pour les autres demandeurs de Stream sur le même fichier. Si vous spécifiez "FileShare.None", vous demandez alors un accès exclusif, autrement dit tout autre demandeur ne pourra pas ouvrir le fichier tant que vous n'aurez pas libéré l'accès.

    D'ailleurs, dans votre même programme, si vous avez ouvert un flux sur ce fichier dans ce mode et que vous redemandez un autre flux sur le même fichier, alors le second cas lèvera une exception.

    Enfin, il faut bien signaler de la même manière que si le fichier est déjà ouvert, le constructeur de FileStream avec l'option "FileShare.None" lèvera une exception. Il n'y a pas de notion de sémaphore avec une attente que le fichier se libère (du moins pas à ma connaissance).

    N'hésitez pas à consulter les hyperliens que j'ai mis pour vous documenter sur FileStream et les manières de l'utiliser.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    j'avais eu le même soucis un jours, alors j'avais fait un recherche et trouver une petite méthode bien pratique, alors en complément (car c'est en fait le même esprit que la réponse au dessus) de la réponse précédente, voici ce que j'utilise maintenant, quand j'ai besoin de manipuler des fichiers sur des postes :

    Elle utilise le nom du fichier, même si vous ne compter pas ouvrir et manipuler à la base, avec FileStream. Car vous pourrez l'appelez, et construire votre code avec une conditionnelle :



    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    protected static bool IsFileLocked(string fileName)
            {
                try
                {
                    FileStream stream = null;
                    FileInfo file = new FileInfo(fileName);
     
                    try
                    {
     
                        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                    }
                    catch (IOException)
                    {
                        //the file is unavailable because it is:
                        //still being written to
                        //or being processed by another thread
                        //or does not exist (has already been processed)
                        return true;
                    }
                    finally
                    {
                        if (stream != null)
                            stream.Close();
                    }
     
                    //file is not locked
                    return false;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
     
     
    vois methode()
    {
     if(IsFileLocked("test.txt"))
    {
    //on manipule notre fichier, quelle que soit la manière
    }
    else
    {
    //message d'avertissement, le fichier est déjà ouvert
    }
    }
    Mais comme je l’ai dit, c’est vraiment un complément de la réponse de Ph_Gr.

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 456
    Points : 384
    Points
    384
    Par défaut
    Bonjour

    Merci pour vos réponses , aprés mon recherche je me suis tombé sur ce truc
    à votre avis cette méthode est bien ? elle ne pose pas des problèmes ?

    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
     
    static private Object thisLock = new Object();
    static void RW()
            {
     
     
                lock (thisLock)
                {
                    StreamReader sr = File.OpenText("test.txt");
                    n = int.Parse(sr.ReadLine());
                    sr.Close();
                    n++;              
                    StreamWriter sw = File.CreateText("test.txt");
                    sw.WriteLine(n.ToString());
                    sw.Close();
                }
     
            }
    Merci pour vous

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 93
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,

    Si j'ai bien compris votre problème vous possédez 300 applications qui vont pointer vers le même fichier et changer une valeur voire en rajouter.

    Dans vos spécifications, impose t on un fichier .txt ?
    Sinon du XML ou base de donnée cela fait très simplement.

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2011
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 456
    Points : 384
    Points
    384
    Par défaut
    Oui
    C'est ça

    Dans les specs , on peut pas sauvegarder la variable dans la DB
    il faut utliser un fichier , mais je ne sais pas si fichier txt ou XML (c'est pas marqué)

    Merci

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

Discussions similaires

  1. [JSF 2] Protéger l'accès à un fichier XHTML
    Par facilus68 dans le forum JSF
    Réponses: 33
    Dernier message: 24/02/2015, 15h48
  2. [2.x] Protéger l'accès à des fichiers uploadés
    Par dnd888 dans le forum Symfony
    Réponses: 4
    Dernier message: 24/12/2012, 18h03
  3. Protéger l'accès à un fichier
    Par DiverSIG dans le forum Apache
    Réponses: 18
    Dernier message: 20/10/2011, 11h02
  4. Réponses: 4
    Dernier message: 04/03/2010, 15h12
  5. Protéger accès fichier
    Par alex'l dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2008, 14h02

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