bonjour,
je cherche a remplir un flux de sortie, tant qu'il y a encore des données (issues de la lecture d'un fichier via le protocole FTP) à y envoyer. Mais à la fin de toute l'opération, je constate que mon fichier de sortie contient des octets en moins (si j'utilise l'opérateur <<) ou en trop (si j'utilise la méthode ofstream::write). Voici un testcase réduit:
L'entier s ne sert qu'a débuguer, il compte le nombre d'octets total lus par FtpRead(). A la sortie de la boucle, s contient bien la taille du fichier src, comme attendu. Par contre, le fichier dst est trop gros (sa taille est supérieure à la valeur de s)... le problème viendrait de ofs.write() ?
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 ofstream ofs(dst, ios::trunc); if (!ofs) return false; char buf[256]; int n = sizeof(buf); int s = 0; while (42) { if (!FtpRead(src, buf, n)) return false; if (n <= 0) break; ofs.write(buf, n); s += n; } FtpEndRead();
Voici la méthode FtpRead (qui utilise l'API wininet):
Merci d'avance :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 bool CNetwork::FtpRead(const char *file, const char *dst, int &size) { if (_h_ftp == NULL) { _h_ftp = FtpOpenFile(_h_connect, file, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0); if (_h_ftp == NULL) return false; } DWORD n; if (InternetReadFile(_h_ftp, (LPVOID)dst, (DWORD)size, &n) == FALSE) return false; size = n; return true; }
Partager