2010-02-09 10 views
7

OS cible File.Delete() est: Win2003atomique sous .NET

Comme posté dans d'autres SO questions sur atomicité de fonctionnement du fichier, Win32 est tout simplement pas conçu pour les transactions. Je me demande encore si la suppression de fichier pourrait être non-atomique. Après tout, il est soit supprimé ou non. Ou un fichier peut-il rester dans un autre état intermédiaire sur un système de fichiers NTFS provoqué par un plantage du système ou autre chose lors de la suppression?

Répondre

12

NTFS est un journaled file system. Un journal est essentiellement équivalent à un journal de transactions dans une base de données. Cela garantira la cohérence et l'intégrité des structures du système de fichiers comme le fait une base de données pour ses tables. Alors que File.Delete n'a pas de code transactionnel au niveau haut, NTFS maintient l'intégrité transactionnelle au niveau du système de fichiers. Cela peut ne pas être vrai pour les autres pilotes de système de fichiers.

5

question ancienne, mais si je pouvais ajouter @ la réponse de Mehdrad, d'un point de vue légèrement différent ...

Sous Windows, la suppression d'un fichier est souvent même pas complètement synchrone, et il est même pas opération unique. En ce sens, ce n'est certainement pas atomique. Si vous consultez des outils comme process monitor ou consultez la documentation MSFT pour l'écriture d'un pilote de système de fichiers, vous remarquerez que la suppression d'un fichier sous Windows est un processus en plusieurs étapes. D'abord, vous avez besoin d'un handle pour le fichier. Ensuite, vous définissez sa disposition sur "supprimé". Cela met le fichier dans un état où il a un "delete pending". Le fichier ne sera même pas retiré de la vue tant que le dernier descripteur n'est pas fermé. Lorsqu'un fichier est dans cet état, les nouvelles tentatives d'ouverture du fichier échoueront avec STATUS_DELETE_PENDING. Ce statut est plus une chose d'exécution - si vous avez tiré la prise ou fait un redémarrage les fichiers ne resteront pas dans cet état. Cela peut ne pas être pertinent pour la façon dont vous utilisez les suppressions, mais il est important de garder à l'esprit que sous Windows, une suppression ne sera pas nécessaire immédiatement et sous un accès simultané, elle peut bloquer d'autres requêtes. hors d'arriver au dossier.

+0

Pour clarifier: Comme expliqué, le processus d'exécution pour supprimer un fichier n'est pas atomique car il comporte plusieurs étapes. Cependant, l'action réelle dans le système de fichiers (NTFS) _is_ atomique, donc une suppression est physiquement effectuée dans son ensemble ou pas du tout. – mafu

+0

@mafutrct - Je ne suis pas d'accord avec votre évaluation. Comme je l'ai mentionné, la suppression d'un fichier sur NT est un processus en plusieurs étapes et peut être observé à ne pas avoir terminé jusqu'à ce que le dernier handle du fichier soit supprimé. – asveikau

+1

Oui, mais les modifications physiques apportées au système de fichiers (contrairement aux étapes de changement virtuel dans la RAM que vous avez expliquées) sont atomiques, si je comprends bien. C'est-à-dire, peu importe quand le processus de suppression sous NTFS interrompt le système, l'état sera cohérent - le fichier sera soit complètement supprimé, soit il ne sera pas supprimé du tout. Je crois que c'est important, car si ce n'était pas le cas, le processus de suppression d'un fichier devrait être géré très différemment dans le code utilisateur. "Atomic" est peut-être un terme un peu trompeur pour cette idée cependant. – mafu