IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

UnauthorizedAccessException et tentative d'écriture de fichier


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut UnauthorizedAccessException et tentative d'écriture de fichier
    Bonjour à tous,

    Je souhaite, pour une application, changer dynamiquement l'icône de certains dossiers. Pour cela, j'ai recherché sur le net la manière de le faire et à priori, il faut créer un fichier desktop.ini avec une ligne IconFile="chemin".

    J'ai en plus trouvé une fonction qui le fait. Le souci étant qu'à l'exécution, l'accès au dossier est systématiquement refusé, quelque soit l'emplacement de ce dossier (en local (bureau, téléchargements), sur le réseau d'entreprise).

    Voici le code et l'erreur (le folderpath est attribué manuellement pour les tests seulement, car normalement le dossier se trouve sur le réseau, j'ai voulu tester d'abord en local):

    Nom : unauthorizedAccessException.png
Affichages : 129
Taille : 37,9 Ko

    Le PC est sous windows 7 professionnel SP1 32 bits. L'UAC a été désactivée pour les tests (essayé avec en plus évidement). Le dossier n'est pas en lecture seule et l'utilisateur a les droits d'administrateur.

    J'ai testé de lancer l'application par la fenêtre (:p) mais c'était pas une bonne idée donc je l'ai lancée en administrateur, toujours rien.

    L'application utilise clickOnce à l'origine, mais j'ai aussi tenté en désactivant la sécurité clickonce (notamment pour lancer en admin l'application) et ça n'a au final rien changé.

    Bref je suis à court d'idées et ai perdu une journée là-dessus. :/

    Si quelqu'un a une idée, je suis preneur.

    Merci à vous par avance et si vous avez des questions n'hésitez pas à les poser, j'y répondrai comme je le pourrais, étant donné que je n'ai pas installé les systèmes ni le réseau dans l'entreprise je ne connais pas tout de leur fonctionnement.

    Edit: Si je supprime le dossier et le recréé(vierge donc), le code s'exécute sans erreur, par contre, l'icône ne change pas pour autant. L'icône montre bien un fichier .ini dedans mais une fois ouvert, et malgré le fait que j'ai coché "montrer les dossiers... cachés et système" dans les options de dossier, le dossier apparait vide, donc impossible d'en vérifier le contenu.

    Et avec un: C:\Users\Utilisateur>more "C:\Users\Utilisateur\Desktop\nomDuDossier\DESKTOP.INI"

    En ligne de commande, ça donne un vide(comme ci-dessus, copié/collé de l'invite de commande)

    Edit2: En enlevant le FileAttributes.Hidden de la ligne:

    File.SetAttributes(iniFilePath, FileAttributes.System)

    Je vois le fichier, il contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [.ShellClassInfo]
    IconFile=C:\Users\Utilisateur\Downloads\commande.ico
    IconIndex=1
    Mais toujours pas de changement d'icône.

  2. #2
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    il y a une chose que je ne comprend pas dans ton code,
    a quoi sert le test suivant?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Dir(Path.Combine(Pathfloder, "DESKTOP.INI")) <> "" Then
        File.Delete(Path.Combine(Pathfloder, "DESKTOP.INI"))
    End If
    Dir est une fonction qui liste les éléments contenus dans un dossier, or la tu test sur ton fichier .INI

    ça va rien te donner,
    a mon avis tu supprime les fichier, puis tu essaye d'écrire dedans, le soucis c'est qu'il n’existe plus ...

    Pour être sur de ce que je te dis,
    essaye de voir s'il existe toujours avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If System.IO.Directory.Exists(Path.Combine(Pathfloder, "DESKTOP.INI")) = False Then
        MsgBox("Fichier inexistant")
    End If
    Ah tien,
    je viens de trouver ce lien qui traite le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    'check and make the directory if necessary; this is set to look in the application
          'folder, you may wish to place the error log in another location depending upon the
          'the user's role and write access to different areas of the file system
          If Not System.IO.Directory.Exists(Application.StartupPath & "\Errors\") Then
              System.IO.Directory.CreateDirectory(Application.StartupPath & "\Errors\")
          End If
     
     
          'check the file
          Dim fs As FileStream = New FileStream(Application.StartupPath & "\Errors\errlog.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
          Dim s As StreamWriter = New StreamWriter(fs)
          s.Close()
          fs.Close()
     
          'log it
          Dim fs1 As FileStream = New FileStream(Application.StartupPath & "\Errors\errlog.txt", FileMode.Append, FileAccess.Write)
          Dim s1 As StreamWriter = New StreamWriter(fs1)
          s1.Write("Title: " & title & vbCrLf)
          s1.Write("Message: " & msg & vbCrLf)
          s1.Write("StackTrace: " & stkTrace & vbCrLf)
          s1.Write("Date/Time: " & DateTime.Now.ToString() & vbCrLf)
          s1.Write("===========================================================================================" & vbCrLf)
          s1.Close()
          fs1.Close()
    PS: penser a chercher sur avant
    PPS: Pense a mettre du commentaire, ou dans 2mois même toi tu ne pourra pas comprendre ce que tu a voulu faire...

  3. #3
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut
    Bonjour,

    En fait de base ces lignes n'existaient pas. Mais je me suis dit "puisque ça ne fonctionne pas au deuxième essai, peut-être qu'il ne peut pas l'overwrite, du coup j'ai fait ça.

    Mais en effet, je me suis trompé dans celui-ci, je teste.

    Edit: Il me dit que le fichier est inexistant alors qu'en parcourant le dossier on voit bien qu'il y est...

    Edit 2: L'insertion dans le fichier fonctionne bien, sans souci, par contre l'icône du dossier ne change pas pour autant.

  4. #4
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut
    Avec ce code, ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Sub SetFolderIcon(ByVal folderPath As String, ByVal iconPath As String)
    	Debug.Print(folderPath)
    	Dim oDir As New System.IO.DirectoryInfo(folderPath)
    	If Not System.IO.Directory.Exists(folderPath) Then
    		System.IO.Directory.CreateDirectory(folderPath)
    	Else
    		If IsFolderReadOnly(folderPath) Then
    			oDir.Attributes = oDir.Attributes And Not IO.FileAttributes.ReadOnly
    		End If
    	End If
     
    	MsgBox(IsFolderReadOnly(folderPath))
     
    	MsgBox(IsFolderReadOnly(folderPath))
    	Dim fs As FileStream = New FileStream(Path.Combine(folderPath, "Desktop.ini"), FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)
    	Dim s As StreamWriter = New StreamWriter(fs)
    	Using s
    		s.WriteLine("[.ShellClassInfo]")
    		s.WriteLine("IconFile={0}", iconPath)
    		s.WriteLine("IconIndex=0")
    	End Using
    	s.Close()
    	fs.Close()
    	File.SetAttributes(folderPath, FileAttributes.ReadOnly)
    	MsgBox(IsFolderReadOnly(folderPath))
    End Sub
    Private Function IsFolderReadOnly(ByVal Folder As String) As Boolean
    	Dim oDir As New System.IO.DirectoryInfo(Folder)
    	Return ((oDir.Attributes And IO.FileAttributes.ReadOnly) > 0)
    End Function
    Il faut par contre attendre ~2 minutes pour que l'icône se mette à jour. Mais ça finit par fonctionner.

  5. #5
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    c'est bon alors, pense a mettre

    PS: merci d'avoir posté ta solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/05/2012, 10h03
  2. Réponses: 2
    Dernier message: 29/05/2006, 09h54
  3. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  4. Readdir et écriture de fichiers
    Par Soum dans le forum C
    Réponses: 6
    Dernier message: 09/01/2006, 16h36
  5. Réponses: 2
    Dernier message: 15/11/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo