Pb débit USB / affichage progress bar

cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005 - 18 févr. 2004 à 20:17
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005 - 22 févr. 2004 à 01:29
Bon, soyons concis et précis!
Je veux transférer des fichiers sur mon baladeur mp3, c'est comme une clé usb.
Pour copier : j'ai utilisé SHFileOperation, ca marchait mais je ne peux pas gérer la fenêtre de copie et la progress bar, tout est automatique... D'autre part, la fonction n'aime pas qu'un PC soit connecté à un intranet et bug pour effacer car elle veut absolument balancer à la corbeille, qui n'existe pas sur la clé usb bien entendue. Bon en captant l'exception ça efface, sauf si Intranet... là elle n'efface que dalle. (c un pote qui l'a remarqué).
Y a CopyFile, mais pas de gestion de progress bar... CopyFileEx n'est pas compatible Win98 et je veux que mon prog le soit.
Bon, finalement c'est assez long! :o)
Conclusion je me rabat sur :

fopen(fichier source)
fopen(fichier dest)

while(!foef(source))
{
fread(source)
fwrite(dest)

/****** et la je gère mes progress bar ******/

}

fclose(dest)
fclose(source)

Bon, ca marche super de disque dur à disque dur, mais le gros hic, c'est que la boucle while se fait à toute vitesse, mais que l'écriture ne se termine que lors du fclose(dest)... car le fwrite n'est pas bloquant! Et le temps de transfert sur port USB est bien supérieur à celui de l'execution de la boucle while...
Donc gros hic : les progress bar se remplissent à toute pompe... et le prog bloque gentiment sur le fclose(dest) pour passer au fichier suivant...

Quelqu'un peut me dire comment capter la quantité réellement écrite.

PS : j'ai essayé de capter la taille du fichier écrit, mais elle est à 0 jusqu'à la fin du fclose(dest).
PS 2 : j'ai pensé capter l'espace libre sur le lecteur, mais c'est un peu la chasse au pigeon avec un lance roquette... et je ne suis meme pas sur que ca marche... comme la taille ne semble prendre effet qu'à partir du fclose(dest).

En gros, HELP!!!! PLEASE!!!!!

6 réponses

cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
18 févr. 2004 à 22:24
euh, meme le coup de l'espace sur le lecteur ne marche pas, meme syndrome... j'ai pensé au fflush, sans effet...
je suis vraiment à cours là... svp :'(
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
18 févr. 2004 à 22:34
Bonjour,

Si tu lisais une fois ton fichier et que tu utilises fputc() pour écrire sur ta clé ?

Perso j'ai pas encore fait de test mais je pense que se serai bon.

Si ca ne marche pas je ferai des tests pour te donner une solution !

@+
Arnotic
Admin CS, MVP Visual C++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
18 févr. 2004 à 23:53
Merci de m'avoir répondu...
Ouais, je peux essayer, mais transférer 200 Mo octet par octet... Dis moi, y a aurait il moyen de synchroniser les lecture/écriture. Je veux dire : "ne lis pas dans le buffer tant qu'il n'a pas été écrit dans le fichier"... je vais essayer!

Merci encore.

Note que c'est con... ca marche mais c'est juste pour une histoire de progress bar :(
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
19 févr. 2004 à 00:38
Je l'ai !!!!!!! Ca fait 6 heures que je cherchais, j'ai un mal de tête affreux et plus de forfait (c pour ca que je n'ai pas pu chercher pendant des heures sur le net)! J'ai trouvé (sur MSDN... ) la fonction _commit : "Flushes a file directly to disk"

-> ca donne çà :

int inHandle = _open(fileSourcePath, _O_RDONLY | _O_BINARY);
int outHandle = _open(fileDestPath, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY);

while(!_eof(inHandle))
{
// lecture d'un paquet
taillePaquetLu = _read(inHandle, opBuffer, taillePaquet);

// écriture de celui-ci
_write(outHandle, opBuffer, taillePaquetLu);

_commit(outHandle); // <------- LUI

// progress bar des fichiers
currentProgressFile += progressFileStep;
m_ctrlProgressFile.SetPos((int) currentProgressFile);

// progress bar totale
currentProgressTotal += progressTotalStep;
m_ctrlProgressTotal.SetPos((int) currentProgressTotal);
}

_close(inHandle);
_close(outHandle);

Et ca marche nickel !!!!!!!!!!!!! j'ai pas trouvé de fonction moins 'bas niveau' , genre 'fcommit' ou un truc dans le genre, mais je m'en fous! :o)
0

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

Posez votre question
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
19 févr. 2004 à 07:51
Bonjour,

Content pour toi ! :-)

@+
Arnotic
Admin CS, MVP Visual C++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
22 févr. 2004 à 01:29
Au cas ou... si ca peut en intéresser certains :

On peut forcer l'écriture sur le DD, pour cela, il faut rajouter "c" lors du fopen ... genre "fichier = fopen(nomdufichier, "wc");"
Et si on fflush(fichier), l'écriture sera forcée.

PS : apparement se problème ne se rencontre que sur win98...
0
Rejoignez-nous