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

Langage Perl Discussion :

[Débutant] modifier les droits sur un fichier


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut [Débutant] modifier les droits sur un fichier
    ou mauvaise utilisation de rename et unlink

    Bonjour,

    je voudrais transformer le nom d'un fichier toto.txt en toto_bis.txt

    donc soit renommer, soit copier avec son nom modifié et effacer l'original.
    J'arrive à faire la copie, mais pas la modification du nom avec la commande rename, ni la suppression, d'où mon interrogation sur les droits sous WINDOWS XP

    Voici le script :
    ------------------------------------------------------------
    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
      use Cwd;
      use File::Copy;
     
      $RepCourant = cwd();
      my @nom_fichiers;
      print "lit le repertoire courant: $RepCourant \n";
     
      # Ouverture d'un repertoire
      opendir (my $FhRep, $RepCourant) 
        or die "impossible d'ouvrir le repertoire $repertoire\n";
     
      # Liste nom_fichiers et repertoire sauf (. et ..)
      my @Contenu = grep { /.txt/ } readdir($FhRep);
     
      # Fermeture du répertoire
      closedir ($FhRep);
     
    # On recupere tous les nom_fichiers
      foreach my $nom_fichier ( @Contenu ) {
        open my($fichier), '<', $nom_fichier
         or die "Ce fichier $nom_fichier n'a pu etre ouvert : $!\n";
     
    # "_bis" est le nom du repertoire que je voudrais accoller 
    # au nom du fichier
      $term="_bis";
      $longavg=length($RepCourant);
      $longfic=length($nom_fichier);
     
    # extraction du l'extension du fichier sur 3 caractères et du
     
    # "." qui la précède 
     
      $nom_fichier_dim = substr($nom_fichier,0,$longfic -4);
     
    # ajout de "_bis.txt" au nom du fichier
     
      $nom_fichier_resu = $nom_fichier_dim .$term .".txt";
      $nom_fichier_complet = $RepCourant ."\/" . $nom_fichier;
      $nom_fichier_resu_complet = $RepCourant ."\/" . $nom_fichier_resu;
      print "toto \n $nom_fichier_complet \n $nom_fichier_resu_complet \n";
      copy ($nom_fichier_complet, $nom_fichier_resu_complet)
       or die "Pas moyen de renommer $nom_fichier en $nom_fichier_resu .";
      unlink ($nom_fichier_complet);
    }
    --------------------------------------------------------------
    Merci d'avance si quelqu'un peut m'envoyer vers la bonne doc ou voit tout de suite ce qui ne va.

    cordialement

    ... un peu plus tard :

    pour mon problème spécifique, j'aurai la possibilité d'ajouter une ligne avec la commande ATTRIB dans un script windows qui appellera le script PERL et résoudra mon problème. J'espère avoir aider quelqu'un.

    cordialement

  2. #2
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Pense à mettre en début de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Ensuite, j'ai testé ton script et semble fonctionner en corrigeant les erreurs. J'ai testé sous Debian GNU/Linux, pas de windows sous la main.
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Cwd;
    use File::Copy;
     
    my $RepCourant = cwd();
    my @nom_fichiers;
    print "lit le repertoire courant : $RepCourant \n";
     
    # Ouverture d'un repertoire
    opendir (my $FhRep, $RepCourant) 
    	or die "impossible d'ouvrir le repertoire $RepCourant\n";
     
    # Liste nom_fichiers et repertoire sauf (. et ..)
    my @Contenu = grep { /.txt/ } readdir $FhRep;
     
    # Fermeture du répertoire
    closedir ($FhRep);
     
    # On recupere tous les nom_fichiers
    foreach my $nom_fichier ( @Contenu ) {
    	open my($fichier), '<', $nom_fichier
    		or die "Ce fichier $nom_fichier n'a pu etre ouvert : $!\n";
     
    	# "_bis" est le nom du repertoire que je voudrais accoller 
    	# au nom du fichier
    	my $term = '_bis.txt';
    	my $longavg = length $RepCourant;
    	my $longfic = length $nom_fichier;
     
    	# extraction du l'extension du fichier sur 3 caractères et du
    	# "." qui la précède 
    	my $nom_fichier_dim = substr $nom_fichier,0,($longfic -4);
     
    	# ajout de "_bis.txt" au nom du fichier
    	my $nom_fichier_resu = $nom_fichier_dim .$term;
    	my $nom_fichier_complet = $RepCourant ."\/" . $nom_fichier;
    	my $nom_fichier_resu_complet = $RepCourant ."\/" . $nom_fichier_resu;
    	print "toto \n $nom_fichier_complet \n $nom_fichier_resu_complet \n";
    	copy ($nom_fichier_complet, $nom_fichier_resu_complet)
    		or die "Pas moyen de renommer $nom_fichier en $nom_fichier_resu .";
    	unlink $nom_fichier_complet;
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    je suis moi-même un fan de debian, mais j'ai du mal à convaincre les informaticiens de mon employeur et il faudra donc que ça fonctionne sous WIndows. Je viens d'essayer ATTRIB qui n'est pas suffisant. J'ai essayé également cacls. A poursuivre, donc mon problème n'est plus résolu ...

    Merci pour ta réponse - Message reçu pour use strict et warning

  4. #4
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Je viens d'essayer sur un Windows XP en virtuel, et le script fonctionne à merveille
    Contexte : J'ai créé un dossier sur le bureau et placer deux fichiers texte dedans. J'ai exécuté le script et mes deux fichiers texte sont bien renommés en nom_bis.txt.

    Dans quel contexte as-tu essayé ?
    Quels sont les messages d'erreur (pour attrib, perl, et/ou cacls) ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Tiger-222 Voir le message
    Je viens d'essayer sur un Windows XP en virtuel, et le script fonctionne à merveille
    Contexte : J'ai créé un dossier sur le bureau et placer deux fichiers texte dedans. J'ai exécuté le script et mes deux fichiers texte sont bien renommés en nom_bis.txt.

    Dans quel contexte as-tu essayé ?
    Quels sont les messages d'erreur (pour attrib, perl, et/ou cacls) ?
    D'abord, merci tiger-222 de t'intéresser à ce problème :
    j'ai créé un dossier C:\Essai
    Dans ce dossier, j'ai un fichier essai.txt ainsi qu'un fichier essai.bat :
    attrib -r
    perl addbis.pl

    avec addbis.pl

    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
      use strict;
      use warnings;
      use Cwd;
      use File::Copy;
     
      my $RepCourant = cwd();
      my @nom_fichiers;
      print "lit le repertoire courant: $RepCourant \n";
     
      # Ouverture d'un repertoire
      opendir (my $FhRep, $RepCourant) 
        or die "impossible d'ouvrir le repertoire $RepCourant\n";
     
      # Liste nom_fichiers et repertoire sauf (. et ..)
      my @Contenu = grep { /.txt/ } readdir($FhRep);
     
      # Fermeture du répertoire
      closedir ($FhRep);
     
    # On recupere tous les nom_fichiers
      foreach my $nom_fichier ( @Contenu ) {
        open my($fichier), '<', $nom_fichier
         or die "Ce fichier $nom_fichier n'a pu etre ouvert : $!\n";
     
    # "_bis" est le nom du repertoire que je voudrais accoller 
    # au nom du fichier
      my $term="_bis";
      my $longavg=length($RepCourant);
      my $longfic=length($nom_fichier);
     
    # extraction du l'extension du fichier sur 3 caractères et du
     
    # "." qui la précède 
     
      my $nom_fichier_dim = substr($nom_fichier,0,$longfic -4);
     
    # ajout de "_bis.txt" au nom du fichier
     
      my $nom_fichier_resu = $nom_fichier_dim .$term .".txt";
      my $nom_fichier_complet = $RepCourant ."\/" . $nom_fichier;
      my $nom_fichier_resu_complet = $RepCourant ."\/" . $nom_fichier_resu;
      print "toto \n $nom_fichier_complet \n $nom_fichier_resu_complet \n";
      rename ($nom_fichier_complet, $nom_fichier_resu_complet)
       or die "Pas moyen de renommer $nom_fichier en $nom_fichier_resu .";
     
    }
    la commande rename renvoie le message
    Pas moyen de renommer toto.txt en toto_bis.txt . at addbis.pl line 43.

    Voilà, tu sais tout. Je ne sais pas ce que c'est qu'un bureau virtuel, peut-être qu'il fonctionne mieux qu'un réel ...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Salut,

    Je viens de tester ton code tel quel et cela fonctionne impec.

    Je tourne sous Windows avec perl (v5.10.1) installé via Cygwin.
    La commande a été lancée via la console windows standard.

    Avec ou sans commande attrib, le script fonctionne.

    par contre je pense que ton problème viens de ces deux lignes là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $nom_fichier_complet = $RepCourant ."\/" . $nom_fichier;
    my $nom_fichier_resu_complet = $RepCourant ."\/". $nom_fichier_resu;
    remplace les par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $nom_fichier_complet = $RepCourant ."\\" . $nom_fichier;
    my $nom_fichier_resu_complet = $RepCourant ."\\". $nom_fichier_resu;

  7. #7
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Sinon pour éviter que le script soit dépendant à un OS, tu peux aussi utiliser le module File::Spec pour manier les liens vers les fichiers et ne pas se soucier si c'est un "/" ou un "\" etc.

    Les fonctions "catfile" et "catdir" de ce module sont là pour cela.

    Avec ton exemple par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $nom_fichier_complet = File::Spec->catfile($RepCourant,$nom_fichier);
    my $nom_fichier_resu_complet = File::Spec->catfile($RepCourant,$nom_fichier_resu);

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup à tous les deux !!!

    Je teste vos recommandations et vous communiquerai le résultat. Etant absent quelques jours, ce ne sera pas pour tout de suite

    Cordialement

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par DUDE007 Voir le message
    Merci beaucoup à tous les deux !!!

    Je teste vos recommandations et vous communiquerai le résultat. Etant absent quelques jours, ce ne sera pas pour tout de suite

    Cordialement
    Résolu grâce au snippet de GL_David :
    open FILE, '>truc.txt' or die "truc.txt : $!\n";
    print FILE "Bla bla bla !!!!";
    close FILE;

    donc merci à lui

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/06/2009, 01h32
  2. script: donner les droits sur un fichier
    Par krashvi dans le forum Windows
    Réponses: 1
    Dernier message: 29/12/2008, 15h07
  3. API connaitre les droits sur un fichier/dossier
    Par cerede2000 dans le forum Windows
    Réponses: 9
    Dernier message: 27/10/2008, 16h17
  4. Comment modifier les droits sur un répertoire ?
    Par rattlehead dans le forum Framework .NET
    Réponses: 4
    Dernier message: 19/10/2006, 15h42

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