[c#] copie de fichier au travers d'un réseau interne

Bonjour la zone (et bonne année) !

Je fais appel à vous car j’ai un problème trivial mais qui finit par me prendre le chou. Je dois basiquement copier un fichier d’un drive sur un serveur vers un autre drive sur un autre serveur.

Mais pour être sur de que la copie du fichier soit bonne, on me demande de calculer le checksum du fichier avant la copie et après la copie et de comparer les 2.

Ma question est la suivante : .NET ne génère-t-il pas une IOException si jamais la copie n’est pas effectuée correctement ?

Dois-je vraiment calculer les checksums et les comparer (ce qui est relativement long) ?

Voilà je voulais avoir vos lumières sur ce sujeet aussi basique que la copie de fichier :-/

Merci

Tu passes par le voisinage réseau/partage de fichier Windows?

La question UDP qui tue!

J’utilise la method File.Copy the .NET donc je ne me suis pas posé la question en fait mais en cherchant petit peu je suis tompé là dessus :

“It uses the native Win32 method CopyFile in kernel32.dll. Files are copied over the normal file system or over SMB (which was correctly pointed out to use TCP by mjmarsh). Or as Scott Dorman correctly adds it can use the CreateFile method also in kernel32.dll.” source : http://stackoverflow.com/questions/2410572/file-copy-function

Donc en gros je n’ai pas la main sur le protocol sous-jacent (ce qui me semble normal)

Oui mais voila, tu passes par SMB.
Donc de mémoire vite fait, pour moi SMB utilisait principalement UDP car ca va plus vite que TCP.

Si on admets que SMB utilise TCP, tu as donc un checksum pour chaque paquet. Mais il existe de rare cas ou le checksum n’est pas suffisant pour garantir la transmission. De plus, les erreurs remonté par Copy sont des erreurs directes, c’est a dire que lors de la copie, le disque dur (ou le réseau) dit « impossible d’écrire sur le disque/la machine réseau » parce qu’il y a un problème technique sur les unités.
En aucun cas Copy fait une vérification (genre, il écrit puis il relit pour voir si c’est bon) de la copie.

Du coup, rajouter une vérification par checksum/hachage/whatever permet de rajouter une bonne couche de sécurité quand à l’intégrité des données. Ça se justifie dans un bon paquet de cas très spécifiques, c’est pas utile dans 99% des autres cas :slight_smile:

Les copies, c’est long et c’est pas secure!!

1 « J'aime »

Merci ! Et un md5 suffirait ?

Tu peux toujours faire un md5 ou autre mais a mon avis c’est perdre du temps sur une copie qui sera bonne 99.99% du temps. Et rien ne dit que l’erreur n’arrivera pas au moment ou tu liras le fichier pour calculer un checksum. Et te niqueras ton truc. A mon avis tu te fais chier, fais une copie et basta. Pour le reste smb, udp, tcp, osef, c’est de la branlette et du namedropping.

1 « J'aime »

Et puis si ton fichier est gros, ça implique qu’il repasse sur le réseau dans l’autre sens pour calculer le checksum, à moins de faire un service interrogeable à distance qui fasse ça et qui tourne sur la machine cible.
Ce qui me paraît relou.

Merci les gars !!

Je crois que je vais m’en passer :grin: Car je l’ai implémentée et c’est extremement long avec un fichier de 500Mo Le temps de :

  • calculer le Checksum
  • copier le fichier
  • recalculer le checksum
  • comparer les 2 checksums (bon ok ça ce n’est pas long)