UnauthorizedAccessException dans Vista à partir d'entrées / sorties de fichiers fréquentes avec .Net 2.0

StackOverflow https://stackoverflow.com/questions/822262

Question

Au travail, nous avons migré de Windows XP vers Windows Vista. Après la migration, certains de mes tests unitaires, à l’aide de nUnit, ont commencé à échouer de manière aléatoire avec l’exception System.UnauthorizedAccessException. Les tests ayant échoué impliquent chacun l'écriture des fichiers utilisés pour les tests stockés en tant que ressources incorporées dans la DLL de test dans le répertoire en cours, l'exécution des tests, puis leur suppression, généralement lors de l'installation / démontage ou de l'installation / du démontage de la fixture, en succession rapide. Je le fais pour que mes tests soient agnostiques par rapport à l'emplacement sur le lecteur de chaque développeur à partir duquel ils sont exécutés, sans se soucier des chemins de fichiers relatifs.

Lors du dépannage, j’ai constaté que cela était lié à la création et à la suppression des fichiers. Lors de la suppression, chaque suppression suit le modèle:

if( File.Exists(path) ) { File.Delete(path) }

Lorsque j'entoure ceci d'un bloc try-catch et d'un point d'arrêt sur le catch (si l'exception est levée), le fichier est déjà supprimé du disque. Pour les échecs de la création de fichier, généralement à l'aide de XmlWriter ou StreamWriter, chacun est spécifié pour écraser le fichier s'il existe.

Ce qui est étrange, c’est que, lors de mes recherches, j’ai créé ce programme C # qui semble recréer une exception:

class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        try
        {              
            while (true)
            {
                System.IO.TextWriter writer = new System.IO.StreamWriter("file.txt");
                i++;
                System.Console.Out.WriteLine(i);
                writer.Write(i);
                writer.Close();
                System.IO.File.Delete("file.txt");
            }
        }
        catch (System.UnauthorizedAccessException ex)
        {
            System.Console.Out.WriteLine("Boom at: " + i.ToString());
        }

    }
}

Sur l’une de nos machines sur laquelle XP est toujours installé, il continuera à parcourir des centaines de milliers de personnes sans exception, jusqu’à ce que je le tue. Sur n’importe laquelle de nos machines Vista, l’impression " Boom " entre 150 et 500 itérations.

Etant donné que je n'ai pas accès à une machine Vista en dehors du travail, je ne peux pas déterminer si cette "particularité" est due à la configuration de sécurité de mon employeur, Vista ou Vista elle-même.

Il suffit de dire que je suis assez perplexe.

EDIT:

Je voudrais remercier tout le monde pour leurs réponses. J'ai utilisé le moniteur de processus suggéré par Christian et constaté que les processus TSVNCache de Windows Vista SearchIndexer et TortoiseSVN essayaient d'accéder au fichier cible alors que mon code était en cours d'exécution, comme suggéré par Martin.

Merci encore.

Était-ce utile?

La solution

Avez-vous des scanners de virus? Essayez de les désactiver ou surveillez l'activité du fichier avec ProcMon à partir de http://www.sysinternals.com

Autres conseils

Dans Vista, accédez à Performace Monitor (outils de contrôle> Outils d'administration) et observez les octets virtuels (pour les fuites de mémoire) de votre application lorsqu'elle est en cours d'exécution. L'Analyseur de performances vous donne beaucoup de détails sur le processus que vous souhaitez étudier. Je soupçonne que votre application ne libère pas de ressources car elle travaille beaucoup sur le système de fichiers.

Jouez également avec l'Analyseur de performances pour essayer de voir les autres mesures à l'origine du problème. Il est difficile de blâmer l’un ou l’autre service sans faire une petite enquête.

Peut-il s'agir d'une collision occasionnelle avec un service d'arrière-plan, tel qu'un index de fichier? Essayez de désactiver autant de services que possible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top