2010-07-23 6 views
3

Je fais un protocole, un client et un serveur qui fournissent des fonctionnalités de transfert de fichiers similaires à FTP (entre autres fonctionnalités). Une différence entre mon protocole et FTP est que je voudrais stocker une copie de la structure du répertoire du serveur distant dans un cache local. Le serveur ne fonctionnera que sous Windows (écrit en C++), de sorte que tous les appels API Win32 applicables seront appréciés (le cas échéant). Lorsqu'il est initialement connecté, le client demande aux enfants immédiats (fichiers et répertoires, comme "ls" ou "dir" sans options), puis lorsqu'un utilisateur navigue dans un répertoire, cette étape se répète avec le nouveau parent comme vous pouvez vous y attendre .Comment détecter les modifications dans un répertoire à travers les exécutions de programme?

Bien sûr, la plupart du temps, si le même répertoire d'un serveur donné est demandé deux fois par un client, le contenu du répertoire sera le même. Par conséquent, je voudrais mettre en cache les résultats de chaque liste de répertoires sur le client. Je voudrais un moyen simple de l'implémenter, mais il faudrait prendre en compte les entrées de cache arrivant à expiration en raison de l'accès au fichier/répertoire et des changements de temps et de nom de modification, ce qui est la partie délicate. Je voudrais idéalement quelque chose qui permettrait des listes de répertoires presque instantanées par le client, avec quelque chose comme un hachage qui prend en compte non seulement le contenu des fichiers, mais aussi les changements dans les noms des fichiers des sous-répertoires, les données, les dates de modification et d'accès, etc ...

Ce n'est pas quelque chose qui pourrait dépendre complètement des objets FileSystemWatcher (ou similaires) car il aurait besoin de maintenir ce cache même si le programme n'est exécuté que de temps en temps. Bien sûr, ce serait bien d'aider à maintenir le cache, mais ce n'est qu'une partie du problème. Ma meilleure idée (?) Jusqu'à présent est d'utiliser FindFirstFile() et FindNextFile(), et de trier (en quelque sorte), concaténer et hacher les valeurs trouvées dans les structures WIN32_FIND_DATA (avec le contenu du fichier peut-être), et l'utiliser comme un jeton pour l'expiration (juste pour indiquer un changement dans l'un de ces champs). Ensuite, j'aurais un de ces jetons pour chaque répertoire. Lorsqu'un répertoire est demandé, le serveur va tout hacher et le comparer au hachage mis en cache fourni par le client, et s'il est différent, retourner les données normales, sinon un équivalent HTTP 304. Y a-t-il une façon moins élaborée de faire quelque chose comme ça? Est-ce que "date de dernière modification du répertoire" prend en compte les dates de modification de tous les fichiers de ses sous-répertoires en toutes circonstances? Je suis sûr que le service intégré d'indexation de Windows a quelque chose comme ça, mais idéalement, je n'aurais pas besoin de compter dessus. Parce que ce service est pour le partage de fichiers, quelque chose impliquant des hachages serait particulièrement agréable afin que je puisse trouver automatiquement et efficacement d'autres personnes qui partagent un fichier donné, mais cela pose moins de problème que de perdre le disque pendant le calcul du hachage . Je me demande ce que d'autres qui sont plus expérimentés que moi en programmation feraient pour résoudre ce problème (rsync et subversion ont résolu des problèmes similaires mais pas identiques).

Répondre

0

Vous demandez beaucoup de mise en œuvre d'un système de fichiers de très peu de cerveau (avec mes excuses à A. A. Milne).

Il s'agit en fait d'un terrain bien ficelé et vous feriez bien d'examiner la littérature existante sur les systèmes de fichiers distribués. AFS vient à l'esprit comme un exemple d'une approche très bien étudiée.

Je doute que vous serez en mesure de trouver quelque chose d'utile et précis sans faire de sérieux devoirs. Autrement dit, il serait folie d'ignorer tout l'art antérieur.

Questions connexes