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 :

Problème avec ReadDirectoryChangesW


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Par défaut Problème avec ReadDirectoryChangesW
    bonjour,

    J'ai un problème avec ReadDirectoryChangesW. Je cherche à surveiller un répertoire et faire une action lorsque des fichiers sont ajoutés dans ce répertoire (par un autre processus que je ne contrôle pas).

    Avec ReadDirectoryChangesW je détecte bien la création d'un fichier mais je souhaite en plus détecter la fin de création de ce fichier. Ces fichiers que je souhaite manipuler font parfois plusieurs Go or ça prend du temps pour se copier ce qui me cause quelques soucis

    Avec ReadDirectoryChangesW existe t il un moyen de ne déclencher l'événement FILE_ACTION_ADDED que lorsque le fichier est fini de copier?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Nico118 Voir le message
    Avec ReadDirectoryChangesW existe t il un moyen de ne déclencher l'événement FILE_ACTION_ADDED que lorsque le fichier est fini de copier?
    Pas que je sache. Ceci dit, comment-est ce que tu défini "fini de copier" ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Je réfléchis de façon abstraite car je ne connais pas la(les) API(s) concernées, mais Nico118 ne pourrait-il pas utiliser son évènement pour ajouter le fichier à une liste de fichiers en cours d'écriture, et surveiller régulièrement pour voir quand le fichier est fermé en écriture? A moins que le process qui ajoute les fichiers ne fasse la copie en ouvrant le fichier en mode ajout plusieurs fois de suite, ne peut-il pas détecter le fait que le fichier est ouvert en écriture, et définir la fin de copie comme le moment où le fichier est refermé par le process qui fait la copie?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Pas que je sache. Ceci dit, comment-est ce que tu défini "fini de copier" ?
    Quand je dit fini de copier pour moi ça veut dire que tous les octets du fichiers sont copiés

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Nico118 Voir le message
    Quand je dit fini de copier pour moi ça veut dire que tous les octets du fichiers sont copiés
    Oui, mais pour l'ordinateur, ça n'a aucun sens. Pour lui, il s'agit d'un ensemble d'écriture dans le fichier. Il peut détecter la création du fichier, ou une modification de sa taille, mais il ne pourras jamais te dire "ca y est, il a fini de grossir". Ne sachant pas que le fichier est généré lors d'une copie, il n'a aucune information sur laquelle il pourrait se baser.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Il peut détecter la création du fichier, ou une modification de sa taille, mais il ne pourras jamais te dire "ca y est, il a fini de grossir".
    Donc, sais-tu si des API existent permettant de détecter que le fichier est actuellement ouvert en écriture par un process quelconque? Si le process qui copie le fichier fait son écriture en une fois (ouvre en écriture, balance toutes les données, j'ai finit, ferme le fichier), on pourrait déduire que la copie est finie du fait que le fichier est fermé en écriture. Est-ce que ça tient assez la route pour résoudre le problème de Nico118?

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Par défaut
    Citation Envoyé par therwald Voir le message
    Donc, sais-tu si des API existent permettant de détecter que le fichier est actuellement ouvert en écriture par un process quelconque? Si le process qui copie le fichier fait son écriture en une fois (ouvre en écriture, balance toutes les données, j'ai finit, ferme le fichier), on pourrait déduire que la copie est finie du fait que le fichier est fermé en écriture. Est-ce que ça tient assez la route pour résoudre le problème de Nico118?
    J'ai pensé à ça mais je n'ai pas réussi à le faire

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par therwald Voir le message
    Donc, sais-tu si des API existent permettant de détecter que le fichier est actuellement ouvert en écriture par un process quelconque? Si le process qui copie le fichier fait son écriture en une fois (ouvre en écriture, balance toutes les données, j'ai finit, ferme le fichier), on pourrait déduire que la copie est finie du fait que le fichier est fermé en écriture. Est-ce que ça tient assez la route pour résoudre le problème de Nico118?
    Oui, mais qui te dis que le fichier sera ouvert et copié en une fois ? A moins d'avoir une contrôle quasi total le logiciel qui fait la copie, tu ne peux pas en être sûr. D'autant plus qu'un utilisateur peut avoir installé un hook sur CopyFile et CopyFileEx (par exemple pour utiliser Teracopy).

    Donc, en théorie, ça peut aider si c'est effectivement ce qui se passe, mais en pratique, un tel comportement ne peut pas être garanti.

    Pour déterminer si un fichier est ouvert en écriture par quelqu'un d'autre, il suffit de vérifier s'il est ouvrable de manière exclusive. S'il ne l'est pas, mais qu'il existe, alors le fichier est en cours d'utilisation. Donc : OpenFile() avec OF_SHARE_EXCLUSIVE comme flag.

    OF_SHARE_EXCLUSIVE (0x00000010)
    Opens a file with exclusive mode, and denies both read/write access to other processes. If a file has been opened in any other mode for read/write access, even by the current process, the function fails.
    cf. http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par Nico118 Voir le message
    mais je souhaite en plus détecter la fin de création de ce fichier. .
    Est-ce que tu utilises des EVENT ?
    Il faut créer un EVENT et appeler WaitForSingleObject.
    D'après les explications données ce ne semble pas le cas

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Tu as tout un exemple détaillé ici
    http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 61
    Par défaut
    Mon code ressemble à ça :
    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
    while(1) {
    	hDir = CreateFile(
    		Rep_FromAutomate,
    		FILE_LIST_DIRECTORY,
    		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    		NULL,
    		OPEN_EXISTING,
    		FILE_FLAG_BACKUP_SEMANTICS,
    		NULL);
     	bResult = ReadDirectoryChangesW(
    		hDir,
    		Buf,
    		10000,
    		FALSE,
    		FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_ACCESS,
    		&RetBytes,
    		NULL,
    		NULL);
     
    	for(;;) {
     
    	pInfo = (FILE_NOTIFY_INFORMATION *)&Buf[dwi];
    switch(pInfo->Action) {
    	case FILE_ACTION_ADDED:
    break;
    case FILE_ACTION_REMOVED:
    	printf("fichier supprime : %s\n", sNomFichier);break;
    default: 
    	printf("autre action sur le répertoire\n");
    	break;
    }
    };
     
    CloseHandle(hDir);

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/12/2007, 20h17
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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