Pb débit USB / affichage progress bar

Signaler
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005
-
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005
-
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

Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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 :'(
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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 :(
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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)
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Bonjour,

Content pour toi ! :-)

@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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...