Détection de la fin d'écriture d'un fichier par un autre programme

nanard1402 Messages postés 3 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 19 février 2009 - 19 févr. 2009 à 10:19
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011 - 19 févr. 2009 à 13:20

5 réponses

nanard1402 Messages postés 3 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 19 février 2009
19 févr. 2009 à 10:23
Bonjour à tous,

Désolé pour le premier message fausse manip.

Je vous explique le contexte : j'ai un programme qui contact un 2éme programme via des sockets tcp pour lui demander de générer un son wav. Pour certaines raisons, la communication avec le programme qui génére le son doit être unidirectionnelle : Je peut demander à ce programme de générer le son, mais ce programme ne peut pas me répondre.

Donc voila ce qui se passe : mon programme demande au générateur de son de créer un fichier wav. Ensuite, mon programme doit récupérer le fichier wav pour l'envoyer sur le réseau. Le problême est que le générateur de son n'a pas la possiblité de me dire à quel moment il a fini de générer le son.

J'ai commencé par me basé sur la date de modification du fichier mais cette date est mise à jour dès que le générateur de son commence à modifier le fichier wav et donc, je récupère un fichier wav auquel il manque des données.
Je me suis ensuite basé à la fois sur la date de mofdification et sur la taille du fichier avec le code suivant :

void coach::waitForFile(const string fileName)
{

string now = getNow();
while(isLower(getLastModifTime(fileName)),now))
sleep(0.1);
off_t lastSize = 0;
while(lastSize < getSize(fileName))
{
lastSize = getSize(fileName);
sleep(0.1);
}
}

Toutes les fonctions utilisées dans cette méthode fonctionnent.

getNow() -> Récupére le temps actuel
getLastModifTime(fileName)->Récupére la date de dernière modification du fichier.
isLower(date1,date2)->Compare deux dates entre elles
getSize(fileName)->Récupère la taille du fichier.


Même avec cette méthode, je récupère un fichier wav incomplet.

Qualqu'un saurait pourquoi? Y a t-il une autre manière de réaliser ça ?

Merci d'avance.
0
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
19 févr. 2009 à 11:16
En C:

while(r>0)
r = recev(...)

Cordialement,
Sébastien.
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
19 févr. 2009 à 11:24
Si c'est toi qui écrit également le générateur de son, une méthode simple serait qu'il crée un fichier quelconque lorsqu'il a fini de créer le .wav. Ton programme n'a plus qu'à tester l'existence de ce fichier et à l'effacer après récupération du .wav.

Sinon ton appel à sleep(0.1) me semble curieux, la durée de sleep est normalement en millisecondes.

ed73
0
nanard1402 Messages postés 3 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 19 février 2009
19 févr. 2009 à 11:36
Merci pour vos réponses.

Mon problême est que je ne peut pas modifier le générateur de son.
Je dev sous Linux et le sleep de unistd est en sec.

Je n'ai pas compris ta réponse SebLinck pourrait tu la détailler un peu plus stp ?

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
19 févr. 2009 à 13:20
Ben le recev(...) te renvois le nombre d'octet copié,
quand il renvois 0c'est qu'il ni a plus rien a copier
donc ton transfert est finni.

Cordialement,
Sébastien.
0