8 votes

Lecture gracieuse de fichiers sans verrouillage

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.

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

  2. Deuxième méthode :

    • S'inscrire pour recevoir des notifications de changement d'annuaire (par exemple, en utilisant ReadDirectoryChangesW à partir de l'interface WinAPI, ou FileSystemWatcher 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.

1voto

RobertPitt Points 28140

Après les discussions dans les commentaires, ma proposition serait la suivante :

  • Créez une partition sur votre serveur de données, environ 5GB par sécurité.
  • Créez un projet de service Windows en C# qui surveillerait votre pilote de données / emplacement.
  • Lorsqu'un fichier a été modifié, créez une copie locale du fichier, contenant la même structure de répertoire et placez-la sur la nouvelle partition.
  • Créez un autre service qui fera ce qui suit :
    • Surveiller l'utilisation de la bande passante
    • Surveillez les créations de fichiers sur la partition temporaire.
    • Transférez plusieurs fichiers à la fois (Use Threading) vers votre serveur FTP, en respectant l'utilisation de la bande passante au moment présent, en diminuant/augmentant le nombre de threads en fonction du trafic réseau.
    • Supprimez les fichiers de la partition qui ont été transférés avec succès.

Donc, en gros, vous avez vos lecteurs :

  • C: Installation des fenêtres
  • D: Stockage des parts
  • X: Partition temporaire

Vous disposerez alors des services suivants :

  • LocalMirrorService - Montres D: et des copies à X: avec la structure dir
  • TransferClientService - Déplace les fichiers de X: au serveur ftp, supprime de X:
    • Utilisez également les multi-filières pour déplacer les multiples et surveiller la bande passante.

Je parie que c'est l'idée que vous aviez en tête mais cela semble être une approche raisonnable tant que vous êtes vraiment bon avec le développement de votre application et que vous êtes capable de créer un système solide qui pourrait gérer la plupart des problèmes.

Lorsqu'un utilisateur modifie un document dans Microsoft Word, par exemple, le fichier est modifié sur le partage et peut être copié sur le site de l'entreprise. X: même si l'utilisateur continue à travailler dessus, il existe dans Windows une API qui permet de voir si le gestionnaire de fichier est toujours ouvert par l'utilisateur. Si c'est le cas, vous pouvez simplement créer un hook pour surveiller le moment où l'utilisateur ferme le document afin que toutes ses modifications soient terminées, puis vous pouvez migrer vers le lecteur. X: .

ceci étant dit, si l'utilisateur est en train de travailler sur le document et que son PC tombe en panne pour une raison quelconque, le gestionnaire du document/des fichiers peut ne pas être libéré jusqu'à ce que le document soit ouvert à une date ultérieure, causant ainsi des problèmes.

0voto

alldayremix Points 332

Pour quiconque se trouve dans une situation similaire (je suppose que la personne qui a posé la question a mis en œuvre une solution il y a longtemps), je suggérerais une implémentation de rsync .

rsync.net Agent de sauvegarde Windows fait ce qui est décrit dans la méthode 1, et peut également être exécuté comme un service (voir " Utilisation avancée "). Bien que je ne sois pas tout à fait sûr qu'il ait une limitation de la bande passante intégrée...

Une autre solution (probablement meilleure) qui fait ont une limitation de la bande passante est Duplicati . Il sauvegarde aussi correctement les fichiers actuellement ouverts ou verrouillés. Utilise SharpRSync, une implémentation gérée de rsync, pour son backend. Open source également, ce qui est toujours un plus !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X