2009-05-04 10 views
4

Au travail, nous avons migré de Windows XP vers Windows Vista. Après la migration, certains de mes tests unitaires, en utilisant nUnit, ont commencé à échouer de façon aléatoire avec l'exception System.UnauthorizedAccessException levée. Les tests échoués impliquent chacun l'écriture de fichiers utilisés pour les tests stockés dans la DLL de test dans le répertoire courant, exécutant les tests, puis les supprimant, généralement dans le setup/teardown ou le setup/teardown, rapidement. Je fais ceci pour que mes tests soient agnostiques à l'emplacement sur le lecteur de chaque développeur à partir duquel ils sont exécutés et ne se soucient pas des chemins de fichiers relatifs. En résolvant ce problème, j'ai trouvé que cela concernait la création et la suppression des fichiers. En cas de suppression, chaque suppression suit le modèle:UnauthorizedAccessException dans Vista à partir d'E/S de fichiers fréquents avec .Net 2.0

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

Quand j'entourent ce avec un bloc try-catch et point d'arrêt sur les prises (si l'exception a été lancée), le fichier serait déjà supprimé du disque. Pour les échecs de la création de fichiers, généralement en utilisant XmlWriter ou StreamWriter, chacun est spécifié pour écraser le fichier s'il existe.

chose étrange est, en enquêtant, j'ai créé ce programme C# qui semble recréer l'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 une de nos machines qui a encore XP, il gardera itérer dans les centaines de des milliers sans exception jusqu'à ce que je le tue. Sur n'importe laquelle de nos machines Vista, il imprimera "Boom" n'importe où entre 150 et 500 itérations. Comme je n'ai pas accès à une machine Vista en dehors du travail, je ne peux pas déterminer si cette bizarrerie particulière est due à la configuration de sécurité de Vista ou Vista par mon employeur. Il suffit de dire, 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 j'ai constaté que les processus TSVNCache de Windows Vista SearchIndexer et TortoiseSVN essayaient d'accéder au fichier cible pendant l'exécution de mon code, comme suggéré par Martin.

Merci encore.

Répondre

1

Dans Vista, allez sur Performace Monitor (controlpanrl-> Outils d'administration) et observez les octets virtuels (pour les fuites de mémoire) pour votre application lorsqu'elle est en cours d'exécution. Le moniteur 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.

Également jouez avec le moniteur de performance pour essayer et voir d'autres mesures qui pourraient avoir causé votre problème. Il est difficile de blâmer l'un ou l'autre service sans faire une petite enquête.

1

Pourrait-il parfois être en collision avec un service d'arrière-plan, comme une indexation de fichier? Essayez d'éteindre autant de ces services que vous le pouvez.

Questions connexes