Aperçu du tableau blanc
Les images ci-dessous sont 1000 x 750 px, ~130 kB JPEGs
hébergé sur ImageShack.
Informations complémentaires
Je dois préciser que chaque utilisateur (des boîtiers clients) travaillera directement à partir de l'écran de l'ordinateur. /Foo
partager. En raison de la nature de l'entreprise, les utilisateurs n'auront jamais besoin de voir ou de travailler simultanément sur les documents des autres, de sorte que les conflits de cette nature ne seront jamais un problème. L'accès doit être aussi simple que possible pour eux, ce qui signifie probablement la mise en correspondance d'un lecteur avec leurs documents respectifs. /Foo/username
sous-répertoire.
De plus, personne d'autre que mes applications (internes et celles sur le serveur) n'utilisera directement le répertoire FTP.
Mises en œuvre possibles
Malheureusement, il ne semble pas que je puisse utiliser des outils standard tels que WinSCP, car une autre logique doit être intimement liée au processus.
Je pense qu'il y a deux moyens simples pour moi d'accomplir ce qui précède du côté interne.
-
Première méthode (lente) :
-
Marchez sur le
/Foo
l'arborescence du répertoire toutes les N minutes. -
Diff avec l'arbre précédent en utilisant une combinaison d'horodatage (peut être falsifié par des outils de copie de fichiers, mais n'est pas pertinent dans ce cas) et de vérification-summation.
-
Fusionner les changements avec un serveur FTP hors site.
-
-
Deuxième méthode :
-
S'inscrire pour recevoir des notifications de changement d'annuaire (par exemple, en utilisant
ReadDirectoryChangesW
à partir de l'interface WinAPI, ouFileSystemWatcher
si vous utilisez .NET). -
Changements de registre.
-
Fusionner les changements avec un serveur FTP hors site toutes les N minutes.
-
Je finirai probablement par utiliser quelque chose comme la deuxième méthode pour des raisons de performances.
Problème
Comme cette synchronisation doit avoir lieu pendant les heures de bureau, le premier problème qui se pose est celui de l'étape du téléchargement hors site.
Pendant que je transfère un fichier hors site, je dois effectivement empêcher les utilisateurs d'écrire dans le fichier (par exemple, en utilisant la fonction CreateFile
con FILE_SHARE_READ
ou quelque chose comme ça) pendant que je le lis. Les vitesses Internet en amont de leur bureau sont loin d'être symétriques à la taille des fichiers avec lesquels ils vont travailler, il est donc tout à fait possible qu'ils reviennent au fichier et tentent de le modifier alors que je suis toujours en train de le lire.
Solution possible
La solution la plus simple au problème ci-dessus serait de créer une copie du ou des fichiers en question ailleurs dans le système de fichiers et de transférer ces "instantanés" sans perturbation.
Les fichiers (certains seront binaires) avec lesquels ces personnes travailleront sont relativement petits, probablement 20 Mo, de sorte que leur copie (et donc leur verrouillage temporaire) sera presque instantanée. Les chances qu'ils tentent d'écrire dans le fichier au moment même où je le copie devraient être proches de zéro.
Cette solution semble cependant assez moche et je suis certain qu'il existe une meilleure façon de traiter ce type de problème.
Une chose qui me vient à l'esprit est quelque chose comme un filtre de système de fichiers qui s'occupe de la réplication et de la synchronisation au niveau de l'IRP, un peu comme ce que font certains A/Vs. Mais c'est un peu excessif pour mon projet.
Questions
C'est la première fois que je suis confronté à ce type de problème, alors peut-être que j'y pense trop.
Je m'intéresse aux solutions propres qui ne nécessitent pas une complexité excessive de leur mise en œuvre. Peut-être ai-je raté quelque chose dans l'interface WinAPI qui gère ce problème de manière élégante ?
Je n'ai pas encore décidé dans quelle langue j'écrirai, mais je suis à l'aise : C, C++, C#, D, et Perl.