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 :

le fichier est un lien physique vers un autre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Par défaut le fichier est un lien physique vers un autre
    bonjour tout le monde
    comment ecrire un programme c sous unix qui prend en parametre 2 fichiers et qui teste si le premier fichier est un lien physique vers le deuxieme ?
    merci

  2. #2
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Bonjour,
    Sauf si je n'ai rien compris aux liens physiques, "A est un lien physique vers B" a ni plus ni moins de sens que "B est un lien physique vers A".
    Je vous propose:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
     
    static int isHardLink(const char* path1, const char* path2){
    	struct stat attribs;
    	ino_t inode;
    	if(stat(path1, &attribs) == 0){
    		inode = attribs.st_ino;
    		if(stat(path2, &attribs) == 0){
    			return inode == attribs.st_ino;
    		}
    	}
    	return -1;
    }
     
    int main(void) {
    	const char* fichier = "/home/pierre/test";//un fichier texte
    	const char* lien    = "/home/pierre/testln";//résultat de "ln test testln"
    	const char* paslien = "/home/pierre/testpaslien";//un fichier texte quelconque
    	const char* bidon   = "/home/pierre/testbidon";//aucun fichier de ce nom
    	printf("%s, %s: %d\n", fichier, lien, isHardLink(fichier, lien));
    	printf("%s, %s: %d\n", fichier, paslien, isHardLink(fichier, paslien));
    	printf("%s, %s: %d\n", fichier, bidon, isHardLink(fichier, bidon));
    	return EXIT_SUCCESS;
    }
    Dans la fonction, dernière ligne (return -1;), en remplaçant -1 par 0, vous aurez une interface peut-être plus utilisable.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Par défaut
    merci infiniment

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Comparer les numéros d'inode ne suffit pas ; il faut aussi comparer les numéros de device. Ont peut avoir deux fichiers sur deux devices différents, avec le même numéro d'inode.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Par défaut
    qu'est ce qu'un device ?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par maestroENSI Voir le message
    qu'est ce qu'un device ?
    Un périphérique.

    matafan a raison, chaque file system possède une table des inodes et un inode est un lien vers un fichier (je le fais simple).

    Si tu as 2 file system (sur 2 disques durs logiques différents, qu'ils soient sur un seul disque dur physique ou bien 2 différents), tu as 2 tables d'inodes et donc deux fois le même numéro d'inode (qui vont pointer sur 2 fichiers différents puisqu'ils sont sur 2 file system différents).

    Le numéro d'inode n'est pas suffisemment discriminant et il faut rajouter le numéro de device qui est aussi donné dans la structure stat.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par matafan Voir le message
    Comparer les numéros d'inode ne suffit pas ; il faut aussi comparer les numéros de device. Ont peut avoir deux fichiers sur deux devices différents, avec le même numéro d'inode.
    Effectivement, j'étais allé un peu vite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static int isHardLink(const char* path1, const char* path2) {
    	struct stat attribs1, attribs2;
    	if (!stat(path1, &attribs1) && !stat(path2, &attribs2)){
    			return attribs1.st_ino == attribs2.st_ino && attribs1.st_dev == attribs2.st_dev;
    	}
    	return -1;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static int isHardLink(const char* path1, const char* path2) {
    	struct stat attribs1, attribs2;
    	return !stat(path1, &attribs1) && !stat(path2, &attribs2) && attribs1.st_ino == attribs2.st_ino && attribs1.st_dev == attribs2.st_dev;
    }
    Le comportement des deux versions n'est pas le même dans le cas où un des fichiers n'est pas accessible.

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

Discussions similaires

  1. transfert d'un script qui est dans une iframe vers une autre page
    Par brunochp dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/03/2009, 16h14
  2. [Liens] Image vers une autre image
    Par Arn°oO dans le forum Flash
    Réponses: 3
    Dernier message: 26/02/2008, 09h30
  3. Réponses: 4
    Dernier message: 19/12/2005, 11h31
  4. comment savoir si un fichier est un lien symbolique?
    Par trotters213 dans le forum C++
    Réponses: 2
    Dernier message: 02/12/2005, 12h55
  5. Excel : lien hypertexte vers un autre fichier avec nom page
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/11/2005, 09h33

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