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

Entrée/Sortie Java Discussion :

Impossible de locker un fichier sous linux


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Impossible de locker un fichier sous linux
    Bonjour,

    J'ai besoin de locker un fichier au niveau OS.
    C'est-à-dire que le fichier locké ne peux pas être modifié par qui que ce soit (ligne de commande, autre programme, autre thread, etc...)

    J'utilise donc la classe FileLock du package java.nio.channels (je suis sous java 1.5).
    Je locke le fichier puis j'essaie de le renommer ou de le supprimer à partir de l'OS (explorateur windows ou shell linux).
    A ma grande surprise, cela marche très bien sous Windows mais absolument pas sous Linux (distrib Suse).
    Windows m'interdit toute modication alors que sous Linux je peux le renommer ou le supprimer comme si de rien n'était .

    J'ai beau retourner le problème dans tous les sens, je ne vois vraiment pas où je fais une erreur.
    Quelqu'un a t'il eu le même type de problème ?
    Un début d'explication alors ?

    Merci
    Peewee
    When the seagulls follow the troiler, it's because they think that sardins will be thrown into the sea.
    [ EC ]

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Peewee
    Un début d'explication alors ?
    Tout est là : http://javasearch.developpez.com/j2s.../FileLock.html

    Les FileLock sont dépendant de l'implémentation des locks de fichier du systèmes, et peuvent donc varier selon les systèmes...

    Sur certains systèmes ces locks sont obligatoire et le fait de ne pas les repecté provoquera une erreur d'I/O (comme cela semble être le cas sous Windows).

    Sur d'autre les locks sont consultatifs. Donc chaque programme doit vérifier la présence du lock avant d'effectuer des traitements, mais rien ne l'empêche de manipuler le fichier s'il ne le fait pas...

    Enfin d'autre système peuvent utiliser les deux types de locks (obligatoire ou consultatif) selon leurs configurations...


    Pour avoir un comportement portable, il faut considérer que les locks sont consultatifs, et que tous les programmes manipulant le fichiers doivent vérifier l'état du lock...

    a++

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Je vois que cela vous inspire grandement
    Je vous fournis donc un petit programme qui illustre le problème.

    Lancer le main, cliquer sur le bouton lock de l'IHM.
    Prendre un explorateur (sous Windows) ou un shell (sous linux) et essayer de supprimer le fichier 'toto.txt'.

    => Sous Windows, un pop-up d'erreur apparait indiquant qu'il est impossible de supprimer le fichier (violation de partage).

    => Sous Linux, le fichier est effacé sans aucun avertissement !!!!

    A part un gros bug du FileLock sous Linux je vois pas. Mais je n'ose y croire.

    Merci de votre aide.
    Peewee

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.channels.ClosedChannelException;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    import java.nio.channels.OverlappingFileLockException;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public final class LockMe implements ActionListener {
     
        public static void main( String[] args ) {
            new LockMe();
        }
     
        // WINDOWS
        // private final static String LOCKED_FILE = "c:\\tmp\\toto.txt";
     
        // LINUX
        private final static String LOCKED_FILE = "/tmp/toto.txt";
     
        private FileChannel channel;
        private FileLock lock;
     
        public LockMe() {
            JFrame frame = new JFrame();
     
            JButton lockButton   = new JButton( "Lock" );
            JButton unlockButton = new JButton( "Unlock" );
     
            lockButton.setActionCommand( "LOCK" );
            lockButton.addActionListener( this );
     
            unlockButton.setActionCommand( "UNLOCK" );
            unlockButton.addActionListener( this );
     
            JPanel panel = new JPanel( new BorderLayout() );
            panel.add( lockButton, BorderLayout.NORTH );
            panel.add( unlockButton, BorderLayout.SOUTH );
     
            frame.getContentPane().add( panel );
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     
            frame.pack();
            frame.setVisible( true );
        }
     
        public void actionPerformed( ActionEvent inE ) {
            String command = inE.getActionCommand();
     
            if( command.equals( "LOCK" ) ) {
                System.out.println( "======= LOCK ME" );
                try {
                    this.channel = new RandomAccessFile( new File( LOCKED_FILE ), "rw" ).getChannel();
                    this.lock = this.channel.lock();
                } catch( ClosedChannelException cce ) {
                    cce.printStackTrace();
                } catch( OverlappingFileLockException ovlfe ) {
                    ovlfe.printStackTrace();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
     
            } else if (command.equals( "UNLOCK" ) ) {
                System.out.println( "======= UNLOCK ME" );
     
                try {
                    this.lock.release();
                    this.channel.close();
                }
                catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }
    When the seagulls follow the troiler, it's because they think that sardins will be thrown into the sea.
    [ EC ]

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas un bug : le fonctionnement dépend du système :

    Citation Envoyé par adiGuba
    Sur d'autre les locks sont consultatifs. Donc chaque programme doit vérifier la présence du lock avant d'effectuer des traitements, mais rien ne l'empêche de manipuler le fichier s'il ne le fait pas...
    a++

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci de ton aide adiGuba

    Donc si j'ai bien compris, le lock étant consultatif sous Linux, il me sera impossible d'empêcher un programme extérieur (ou un utilisateur quelconque via une commande 'rm' depuis un shell) d'effacer le fichier locké ?

    En gros si un fichier est locké par un programme java, tout autre programme voulant le modifier doit d'abord demander s'il est déjà locké ?

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Renvoie null si le fichier LOCKED_FILE est déjà locké
    new RandomAccessFile( new File( LOCKED_FILE ), "rw" ).getChannel().tryLock();
    En tout cas j'ai mon début d'explication !
    Encore merci
    Peewee
    When the seagulls follow the troiler, it's because they think that sardins will be thrown into the sea.
    [ EC ]

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

Discussions similaires

  1. Téléchargement de fichier sous Linux
    Par patrick_lassaly dans le forum Administration système
    Réponses: 1
    Dernier message: 03/01/2006, 12h31
  2. fichier sous linux
    Par razord dans le forum C
    Réponses: 2
    Dernier message: 19/09/2005, 12h54
  3. Exclusivité sur un fichier sous linux
    Par ggnore dans le forum Administration système
    Réponses: 4
    Dernier message: 03/11/2004, 10h46
  4. [CVS] "locker" un fichier sous eclipse
    Par Yan83 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/04/2004, 16h55
  5. Les fichiers sous linux/windows
    Par Stessy dans le forum Linux
    Réponses: 5
    Dernier message: 05/12/2003, 10h30

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