Meilleur auteur de réponses
UnauthorizedAcessException sous Universal Windows app Windows 10

Question
-
Bonjour,
J'essaye de créer une class pour gérer mes Logs et autre mais quand j'essaye de créer ce ficher l'erreur suivante est levée:
System.UnauthorizedAccessException' dans mscorlib.ni.dll
La structure du projet c'est:
Projet (3 projets)
-----App1 (Universal Windows)
-----UniversalLog (Universal Windows) (ClassLibrary)
(l'erreur est levée dans cette ClassLibrary dans la méthode SetLogFile dans la try and catch)
----------UniversalLog.cs
-----UnitTest (Universal Windows)
UniversalLog.cs
/// <summary> /// UniversalLog /// </summary> public class UniversalLog { private static UniversalLog instance; private string m_AppName; private StorageFolder installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; private StorageFile fs; public string AppName { get { return m_AppName; } set { m_AppName = value; SetLogFile(); } } /// <summary> /// Prevents a default instance of the <see cref="UniversalLog"/> class from being created. /// </summary> private UniversalLog() { } /// <summary> /// Gets the instance. /// </summary> /// <value> /// The instance. /// </value> public static UniversalLog Instance { get { if (instance == null) { instance = new UniversalLog(); } return instance; } } /// <summary> /// Formats log message. /// </summary> /// <param name="level">The level.</param> /// <param name="className">Name of the class.</param> /// <param name="message">The message.</param> /// <returns></returns> private string Format(LEVEL level, string className, string message) { return string.Format("[{0}]\t[{1}]\t[{2}]\t[{3}]", DateTime.Now.ToString(), level.ToString(), className, message); } /// <summary> /// Sets the log file. /// </summary> /// <exception cref="System.Exception"></exception> async private void SetLogFile() { string fileName = string.Format("{0}LOG.txt", AppName); try { if (!File.Exists(fileName)) { fs = await installFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists); } } catch (Exception Ex) { throw new Exception(Ex.Message); (L'erreur est levée ICI) } } /// <summary> /// Logs the specified level. /// </summary> /// <param name="level">The level.</param> /// <param name="className">Name of the class.</param> /// <param name="message">The message.</param> async public void Log(LEVEL level, string className, string message) { await FileIO.WriteTextAsync(fs, Format(level, className, message)); } /// <summary> /// Logs the specified level. /// </summary> /// <param name="level">The level.</param> /// <param name="className">Name of the class.</param> /// <param name="e">The e.</param> async public void Log(LEVEL level, string className, Exception e) { await FileIO.WriteTextAsync(fs, Format(level, className, e.Message)); } }
Du coup depus un class dans App1, j'ai une méthode qui utilise UniversalLog
Ulog.Log(UniversalLog.LEVEL.ERROR, this.ToString(), e);
J'ai pourtant suivi les infos fournis dans la doc il semble ...
J'ai un deuxième souci mais bon bien moins grave, mon using de UniversalLog dans App1 ne marche pas, lors de la définition de ma variable je suis obligé d'utiliser le namespace avec.
private UniversalLog.UniversalLog Ulog = UniversalLog.UniversalLog.Instance;
J'espère vous avoir fournis toutes les infos pour que vous essayez pas trop de mal pour m'aider,
Si vous avez besoins d'autres infos n'hésitez pas,
Cordialement,
Thomas
lundi 9 novembre 2015 02:46
Réponses
-
Bonjour,
Je pense que vous essayez d'écrire dans le dossier ou l'application est installée.
Or c'est mal, c'est pas bien, c'est même interdit ;-)
Vous pouvez écrire dans les dossiers réservés par le système c'est-à-dire par exemple dans
ApplicationData.Current.LocalFolder
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone- Proposé comme réponse Richard ClarkMVP lundi 9 novembre 2015 12:30
- Marqué comme réponse magicthoto_bx lundi 9 novembre 2015 14:18
lundi 9 novembre 2015 06:54
Toutes les réponses
-
Bonjour,
Je pense que vous essayez d'écrire dans le dossier ou l'application est installée.
Or c'est mal, c'est pas bien, c'est même interdit ;-)
Vous pouvez écrire dans les dossiers réservés par le système c'est-à-dire par exemple dans
ApplicationData.Current.LocalFolder
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone- Proposé comme réponse Richard ClarkMVP lundi 9 novembre 2015 12:30
- Marqué comme réponse magicthoto_bx lundi 9 novembre 2015 14:18
lundi 9 novembre 2015 06:54 -
Effectivement ça marche beaucoup mieux ;) Merci
Mais du coup j'écris dans un dossier qui a un nom assez improbable x) c'est possible de le changer ou d'y faire quelque chose ?
Cordialement
lundi 9 novembre 2015 11:46 -
Et le fichier, même avec le Flag CreationCollisionOption.OpenIfExists se supprime et se recrée.
Cordialement
lundi 9 novembre 2015 14:09