2017-08-11 5 views
0

J'ai hérité des responsabilités de développement pour un ensemble de projets .NET qui incluent des services Windows, un site Web ASP.NET et des exécutables standard qui sont lancés via le gestionnaire de tâches.OK pour que plusieurs processus lisent à partir du même fichier texte?

Tous ces composants se connectent à une base de données MySQL. Actuellement, la chaîne de connexion chiffrée se trouve dans les fichiers individuels app.config/web.config. Je pense que c'est un peu pénible d'avoir à mettre à jour la chaîne de connexion à plusieurs endroits, donc j'ai eu l'idée de mettre la chaîne de connexion dans un fichier texte qui serait accessible par tous les composants individuels. Avant de passer à la vitesse supérieure, je voulais savoir si je pouvais introduire un bogue car il pourrait y avoir plusieurs processus essayant d'accéder à ce fichier texte en même temps. J'ai écrit une méthode universelle pour la lecture du fichier texte, et je pris soin de veiller à ce que le fichier est en cours d'ouverture en mode « lecture »:

public string AESDecryptFromFile(string path, string password, string IV) 
    { 
     if (!File.Exists(path)) 
      throw new Exception("File not found: " + path); 

     string cryptogram; 
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      using (StreamReader sr = new StreamReader(fs)) 
      { 
       cryptogram = sr.ReadToEnd().Trim(new char[] { '\r', '\n', ' ' }); 
      } 
     } 
     return AESDecrypt(cryptogram, password, IV); 
    } 

Je n'ai aucune raison de croire que les processus verrouiller le fichier si je l'implémente de cette façon, mais je pensais que je demanderais.

Merci d'avance!

+0

Pourquoi vous essayez de ne pas le tester? – mason

+0

https://stackoverflow.com/questions/3527205/multiple-threads-reading-from-the-same-file –

+0

@mason - Je voulais dire que je n'ai pas assez de trafic dans mon environnement de développement pour le prouver efficacement en dehors. Je suppose que j'aurais pu écrire un programme de test qui a engendré plusieurs threads. –

Répondre

2

Par défaut avec le constructeur (string path, FileMode mode, FileAccess access) de FileStream va obtenir la configuration suivante ainsi:

  • FileShare = FileShare.Read
  • bufferSize = 4096
  • useAsync = false

Parce que vous ne voulez pas que le processus verrouille le fichier, ce sera parfait pour vous car vous aurez besoin de lire seulement (Voir https://msdn.microsoft.com/en-us/library/system.io.fileshare(v=vs.110).aspx)

Toutefois, si vous voulez être explicite, vous pouvez utiliser le constructeur suivant:

FileStream s = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read); 
+0

Merci, c'est vraiment utile! –

-1

Jusqu'à ce que vous ne changiez pas le fichier c'est OK. Cela crée des problèmes quand vous voulez écrire ou lire et lire à plusieurs threads, parce que vous ne savez pas lequel thread écrira/lire fin/commence d'abord de sorte que vous ne pouvez prédire aucun comportement

-1

Je pense que vous pourriez avoir besoin dire à votre constructeur FileStream comment vous voulez partager le fichier? "fileshare"