locked
UnauthorizedAcessException sous Universal Windows app Windows 10 RRS feed

  • 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 ...

    File Acess Permisions

    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

    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

    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