Question

Je recherche un moyen robuste de copier des fichiers sur un partage réseau Windows tolérant une connectivité intermittente.L'application est souvent utilisée sur des postes de travail mobiles sans fil dans les grands hôpitaux, et je suppose que la connectivité peut être perdue momentanément ou pendant plusieurs minutes à la fois.Les fichiers impliqués ont généralement une taille d'environ 200 Ko à 500 Ko.L'application est écrite en VB6 (pouah), mais nous finissons fréquemment par utiliser des appels de DLL Windows.

Merci!

Était-ce utile?

La solution

Je ne sais pas quel est votre problème réel, je vais donc émettre quelques réflexions.

  • Voulez-vous des copies redémarrables (avec des fichiers de si petite taille, cela ne semble pas être un si gros problème) ?Si c'est le cas, regarde CopierFileEx avec COPYFILERESTARTABLE
  • Voulez-vous des copies vérifiables ?On dirait que vous l'avez déjà en vérifiant les hachages.
  • Voulez-vous de meilleures performances?Cela va être difficile, car il semble que vous ne puissiez rien exécuter sur le serveur.Sinon, Transmettre le fichier peut aider.
  • Voulez-vous juste une opération incendie et oubli ?Je suppose qu'il faut dépenser pour faire des robocopies, ou TeraCopie ou quelque chose fonctionnerait - mais cela me semble un peu hacky.
  • Voulez-vous savoir quand le réseau reviendra ? EstRéseauAlive a votre réponse.

Sur la base de ce que je sais jusqu'à présent, je pense que le pseudo-code suivant serait mon approche :

sourceFile = Compress("*.*");
destFile = "X:\files.zip";

int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE;
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) {
   do {
     // optionally, increment a failed counter to break out at some point
     Sleep(1000);
   while (!IsNetworkAlive(NETWORKALIVELAN));
}

La compression des fichiers vous permet d'abord d'enregistrer les fichiers que vous avez copiés avec succès et ceux que vous devez redémarrer.Cela devrait également rendre la copie plus rapide (taille totale du fichier plus petite et taille de fichier unique plus grande), au détriment d'une certaine puissance CPU des deux côtés.Un simple fichier batch peut le décompresser côté serveur.

Autres conseils

j'ai utilisé Robocopie pour cela avec d'excellents résultats.Par défaut, il réessayera toutes les 30 secondes jusqu'à ce que le fichier soit transmis.

Essayez d'utiliser BITS (Background Intelligent Transfer Service).Il s'agit de l'infrastructure utilisée par Windows Update, accessible via l'API Win32 et conçue spécifiquement pour résoudre ce problème.

Il est généralement utilisé pour les mises à jour d'applications, mais devrait bien fonctionner dans n'importe quelle situation de déplacement de fichiers.

http://www.codeproject.com/KB/IP/bitsman.aspx

Je suis d'accord avec Robocopy comme solution... c'est pourquoi l'utilitaire s'appelle "Copie de fichiers robuste"

J'ai utilisé Robocopy pour cela avec d'excellents résultats.Par défaut, il réessayera toutes les 30 secondes jusqu'à ce que le fichier soit transmis.

Et par défaut, un million de tentatives.Cela devrait suffire pour votre connexion intermittente.

Il effectue également des transferts redémarrables et vous pouvez même limiter les transferts avec un écart entre les paquets, en supposant que vous ne souhaitez pas utiliser toute la bande passante car d'autres programmes utilisent la même connexion (commutateur /IPG) ?.

Que diriez-vous simplement d'envoyer un hachage après ou avant l'envoi du fichier et de le comparer avec le fichier que vous avez reçu ?Cela devrait au moins garantir que vous disposez d'un fichier correct.

Si vous voulez tout mettre en œuvre, vous pouvez suivre le même processus, mais pour de petites parties du fichier.Ensuite, lorsque vous avez toutes les pièces, rejoignez-les du côté récepteur.

Hm, il semble que rsync le fasse et n'a pas besoin de serveur/démon/installation, je pensais que c'était le cas - juste $ rsync src dst.

SMS s'il est disponible fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top