2009-05-11 8 views
0

J'ai une application qui modifie 5 fichiers xml identiques, chacun situé sur un partage réseau différent. Je suis conscient que cela est inutilement redondant, mais "il doit en être ainsi".Modification atomique de fichiers sur plusieurs réseaux

Chaque fois que cette application s'exécute, exactement un élément (pas plus, pas moins) sera ajouté/supprimé/modifié. Initialement, l'application ouvre chaque fichier xml, ajoute/supprime/modifie l'élément au nœud approprié et enregistre le fichier, ou renvoie une erreur si elle ne le peut pas (Impossible d'accéder au partage réseau, timeout, etc ...).

Comment est-ce que je fais cet atomique?

Mon hypothèse de départ était:

foreach (var path in NetworkPaths) 
    if (!File.Exists(path) 
     isAtomic = false; 

if (isAtomic) 
{ 
    //Do things 
} 

Mais je peux voir que seulement aller si loin. Y a-t-il un autre moyen de le faire, ou une direction vers laquelle je peux me diriger?

Répondre

2

Malheureusement, pour que ce soit vraiment "atomique" n'est pas vraiment possible. Mon meilleur conseil serait de conclure votre propre forme de transaction pour ceci, ainsi vous pouvez au moins annuler les changements.

Je ferais quelque chose comme vérifier pour chaque fichier - s'il n'en existe pas, jeter.

Sauvegardez chaque fichier, enregistrez l'état nécessaire à l'annulation ou enregistrez une copie en mémoire si elle n'est pas énorme. Si vous ne pouvez pas, jetez.

Faites vos modifications, puis enregistrez les fichiers. Si vous obtenez un échec ici, essayez de restaurer à partir de chacune des sauvegardes. Vous devrez effectuer une gestion des erreurs ici afin de ne pas lancer avant que toutes les sauvegardes aient été restaurées. Après la restauration, lancez votre exception.

Au moins de cette façon, vous aurez plus de chances de ne pas modifier un seul fichier. Heureusement, si vous pouvez modifier un fichier, vous pourrez le restaurer à partir de votre sauvegarde/annuler votre modification.

1

Je suggère la solution suivante. Essayez d'ouvrir tous les fichiers avec un verrou en écriture.

  • Si un ou plusieurs échouent, abandonnez.
  • Modifier et vider tous les fichiers.
    • Si un ou plusieurs échouent, annulez les déjà modifiés et rincez-les à nouveau.
  • Fermez tous les fichiers. Si l'annulation échoue ... eh bien ... essayez à nouveau, réessayez, et réessayez ... et abandonnez dans un état incohérent.

    Si vous contrôlez tous les processus d'écriture de ces fichiers, vous pouvez implémenter un mécanisme de verrouillage simple à l'aide d'un fichier de verrouillage. Vous pouvez même effectuer une journalisation en écriture et enregistrer la modification planifiée dans le fichier de verrouillage. Si votre processus se bloque, le prochain essayant de modifier les fichiers détecterait l'opération incomplète et pourrait continuer avant de faire une modification.

  • 0

    Je voudrais introduire le versionnement des fichiers. Vous pouvez le faire facilement en ajoutant un suffixe au nom de fichier. par exemple une variable de compteur. Le processus pour le lecteur est comme suit:

    • préparer la prochaine version du fichier
    • écrire dans un fichier temporaire avec un nom différent.
    • obtenez le numéro de version
    • incrément cette version par un
    • renommer le fichier temporaire dans le nouveau fichier
    • supprimer les anciens fichiers (vous pouvez garder par exemple 2 d'entre eux)

    comme lecteur faire - trouver le fichier avec la version la plus élevée - lire

    Questions connexes