[UDF] _FiletypeAssociation (Associations extension fichiers)

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[UDF] _FiletypeAssociation (Associations extension fichiers)

#1

Message par Tlem »

Voici un UDF pour créer des associations de fichiers en fonction de leurs extension.
Non compatible Windows 98.

Suite à un problème de bug dont tolf à subit les inconvénients :cry: , J'ai testé ce code à plusieurs reprise, mais prenez soins de sauvegarder votre base de registre avant de le tester dans tous les sens (Juste au cas ou ...). :mrgreen:

Fichier _FiletypeAssociation.au3 :

Code : Tout sélectionner

#include-once
;====================================================================================================================
; Name              : _FiletypeAssociation
; Description       : Make association of a file
; Syntax            : _FiletypeAssociation($Extension, [$DocumentType, [$Program, [$Description, [$IconFile, [$IconIndex, , [$OverwriteExt]]]]])
; Parameter(s)      : $Extension    - The extension of file to associate.
;                     $DocumentType - The name of the document type  (Nothing for deleting association).
;                     $Program      - The programme path and name to associate with (Nothing for deleting association).
;                     $Description  - The description of document file (Default $Extension.Document).
;                     $IconFile     - The path and name of icon file (Default $Program icon).
;                     $IconIndex    - The index number of icon in file (Default 0).
;                     $OverwriteExt - Indicates if you want to overwrite extension association (Default 1)
; Requirement(s)    : Win32
; Return value(s)   : Return 1 - On Success.
;                     Return 0 - On Failure (@error and @extented are set).
;                     @extented 1 - The program to associate doesn't exists.
;                     @extented 2 - On association deletion if file extension is not exist.
;                     @extented 3 - Extention allready exists and $OverwriteExtension = 0.
;
; Author            : Tlem <tlem at tuxolem dot net>
; Note(s)           : None
; ===============================================================================================================================
Func _FiletypeAssociation($Extension, $DocumentType = "", $Program = "", $Description = "", $IconFile = "", $IconIndex = 0, $OverwriteExt = 1)

    ; If $Extension don't have the left dot, we add it.
    If StringLeft($Extension, 1) <> "." Then $Extension = "." & $Extension

    ; Check valid Extention.
    If Not _CheckExtension($Extension) Then Return 0

    $Err = 0
    
    ; Delete extension ($DocumentType and $Program equal "").
    If $DocumentType = "" And $Program = "" Then
        ; Read document type.
        $DocumentType = RegRead("HKCR\" & $Extension, "")
        ; To return that the key doesn't exist anymore.
        If Not RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $Extension, "") _
                And Not RegRead("HKCR\" & $Extension, "") Then
            SetError(1, 2)
            Return 0
        Else
            ; Delete extension in registry and use ftype.exe to un-associate extension.
            RunWait(@ComSpec & " /c assoc " & $Extension & "=" & "nothing", "", @SW_HIDE)
            ; Make control before deletion
            If Not $Extension = "" Then
                RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $Extension)
                RegDelete("HKCR\" & $Extension)
            EndIf
            ; Make control before deletion
            If Not $DocumentType = "" Then RegDelete("HKCR\" & $DocumentType)
            If RegRead("HKCR\" & $DocumentType, "") = "" And RegRead("HKCR\" & $Extension, "") = "" Then $Err = 1
        EndIf
    Else
        ; Write extension :
        ; If $Program not exists then return error.
        If Not FileExists($Program) Then
            SetError(1, 1)
            Return 0
        ElseIf RegRead("HKCR\" & $Extension, "") And $OverwriteExt = 0 Then
            SetError(1, 3)
            Return 0
        Else
            ; If $DocumentType is empty, use extention and ".Document".
            If $DocumentType = "" Then $DocumentType = $Extension & ".Document"
            ; If name of icon file is empty, use icone of the associted program.
            If $IconFile = "" Then $IconFile = $Program
            ; Write extension in registry and use ftype.exe to make association.
            RunWait(@ComSpec & " /c ftype " & $DocumentType & '="' & $Program & '" "%1" && assoc ' & $Extension & "=" & $DocumentType, "", @SW_HIDE)
            RegWrite("HKCR\" & $DocumentType, "", "Reg_sz", $Description)
            RegWrite("HKCR\" & $DocumentType & "\DefaultIcon", "", "REG_SZ", $IconFile & "," & $IconIndex)
            If RegRead("HKCR\" & $DocumentType & "\Shell\Open\Command", "") <> "" And RegRead("HKCR\" & $Extension, "") = $DocumentType Then $Err = 1
        EndIf
    EndIf
    
    Return $Err
    
EndFunc   ;==>_FiletypeAssociation

Func _CheckExtension($Extension)

    ; A normal extention is 2 or 3 chars long so with the dot it is 3 or 4 chars.
    If StringLen($Extension) < 3 Or StringLen($Extension) > 4 Then Return 0
    
    ; If Extention is in string => error.
    If StringInStr(".exe .bat .dll .dir .lnk", $Extension) Then Return 0

    ; Check for unauthorized chars in extention.
    For $i = 1 To StringLen($Extension)
        $s_CurChar = StringMid($Extension, $i, 1)
        If Not StringRegExp($s_CurChar, '[.~_a-zA-Z]') Then Return 0
    Next
    
    Return 1
EndFunc   ;==>_CheckExtension
Quelques exemples d'utilisation :

Code : Tout sélectionner

; Méthode simple :
;Association des fichiers .abc avec Scite (Icône Scite)
; Le nom de l'extention peut être : ".abc" ou "abc" (Au choix).
If _FiletypeAssociation(".abc", "abc.Document", "%ProgramFiles%\AutoIt3\SciTE\SciTE.exe") Then


; Méthode évoluée :
; Association des fichiers .abc avec Scite (Icône %ProgramFiles%\AutoIt3\Icons\filetype3.ico)
_FiletypeAssociation(".abc", "abc.Document", "%ProgramFiles%\AutoIt3\SciTE\SciTE.exe", "", "%ProgramFiles%\AutoIt3\Icons\filetype3.ico")
    MsgBox(64, "Info", "l'association c'est bien déroulée")
Else
    MsgBox(16, "Erreur", "Erreur lors de l'association des fichiers")
EndIf


; Suppression de l'association des fichiers .abc
If _FiletypeAssociation(".abc") Then   ; Il est possible de ne pas mettre le point
    MsgBox(64, "Info", "La suppression de l'association c'est bien déroulée")
Else
    MsgBox(16, "Erreur", "Erreur lors de la suppression de l'association")
EndIf
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#2

Message par tolf »

Code : Tout sélectionner

RegDelete("HKCR\" & $Extension)
N'y-a-t-il pas de risque que le nom de l'extension corresponde à quelque chose du système (==> et donc la fonction le supprimerait) ?

Code : Tout sélectionner

RegWrite("HKCR\" & $DocumentType, "", "Reg_sz", $Description)
N'y-a-t-il pas de risque que cette partie du registre existe déjà (en fonction de la valeur de $DocumentType) et qu'elle soit donc supprimée ?
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#3

Message par Tlem »

Ce n'est pas pire qu'un :

Code : Tout sélectionner

DirRemove ( $path , 1)
ou un

Code : Tout sélectionner

FileDelete ($file)
 
dont la variable serait mal renseignée. :mrgreen:

Celui qui veut supprimer une extension qu'elle soit système ou pas prend des risques de toutes manières.
Les autres outils font la même chose et celui qui fait des manipulations inconsidérées, prend des risques quoi qu'il arrive.
Si par mégarde, vous supprimez une clé de la base de registre sans prendre des précautions, vous jouez avec le feu et à force, il arrive qu'on se brûle (Et je me suis brûlé quelques fois ... :lol: ).

Le code est présent sur le forum et il est libre de droits, donc chacun peut y effectuer les modifications qu'il souhaite. :wink:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#4

Message par tolf »

Ce que je voulais dire c'est que je me demandais s'il n'y avait pas dans la partie HKCR d'autres informations que les extensions (par ex "HKCR\Windows", de même que dans HKCU il y a "HKCU\Software\Microsoft").
Etant donné que mes connaissances en matière de registre ne sont pas très grandes j'ai sans doute fait une hypothèse idiote :lol:
Après, je suis tout à fait d'accord que l'on peut faire n'importe quoi avec RegDelete si on le veut.
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#5

Message par Tlem »

Hummm je vois à peut prèt ce que vous voulez dire.

Effectivement, il peut être judicieux de rajouter une protection sur des noms d'extension plus grand que 4 ou 5 caractères par exemple, et certaines extensions connues comme EXE, COM, VBS, CMD ...

Si j'y pense et si j'ai du temps à y consacrer, je le ferais.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#6

Message par tolf »

Et il faut aussi éviter que l'extension contienne des caractères non autorisés ("\", "/", etc...) ainsi que le caractère "."
[EDIT]
J'ai ajouté l'option $OverwriteExtension qui permet de choisir de réécrire ou pas une extension déjà existante et j'ai mis le contrôle de certaines extentions (.exe .dll .lnk etc...)
[/EDIT]

[EDIT]
J'ai ajouté l'option OverwriteDocType qui permet de choisir de réécrire ou pas un type de document déjà existant
[/EDIT]
► Afficher le texteCode modifié
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#7

Message par Tlem »

Le code principal à été mis à jour avec une optimisation du contrôle des extensions (longueur, caractères, et type d'extension).

J'ai retenus l'option $OverwriteExtension qui pourrait effectivement servir.

Amélioration aussi de la gestion des codes erreur.
retour 1 ou 0 avec utilisation de @error et @extented.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#8

Message par tolf »

Tlem a écrit :

Code : Tout sélectionner

    ; A normal extention is 2 or 3 chars long so with the dot it is 3 or 4 chars.
    If StringLen($Extension) < 3 Or StringLen($Extension) > 4 Then Return 0
Les extensions ne font pas forcément de 2 à 3 caractères (ex : properties utilisé notamment par SciTE) et ce n'est pas risqué pour le registre de mettre des extensions de plus de 3 caractères.
Tlem a écrit :

Code : Tout sélectionner

        ElseIf RegRead("HKCR\" & $Extension, "") And $OverwriteExt = 0 Then
Il faut aussi vérifier que l'extension n'est pas enregistrée par l'explorer :

Code : Tout sélectionner

        ElseIf (RegRead("HKCR\" & $Extension, "") Or RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $Extension, "")) And $OverwriteExt = 0 Then
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#9

Message par Tlem »

tolf a écrit :Les extensions ne font pas forcément de 2 à 3 caractères (ex : properties utilisé notamment par SciTE)
Oui ca je le sais bien, mais comme je l'ai dit : A normal extention ...
Libre à chacun de faire avec des extensions plus grandes, mais bon, 3 caractères ca suffit.
tolf a écrit :Il faut aussi vérifier que l'extension n'est pas enregistrée par l'explorer
Dans 99% des cas, le HKCU suffit (Le reste des cas étant une erreur de manip ou des choses bien spécifique)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
hunterThompson
Niveau 1
Niveau 1
Messages : 12
Enregistré le : ven. 27 nov. 2009 10:59
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#10

Message par hunterThompson »

Joli script, çà va m'être très utile.

D'après ce que je lis, cela ne devrait pas poser de problème si je le modifie pour accepter des extensions plus longues, et c'est parfait. Par contre, je voudrais votre avis, si je le modifie pour permettre des ajouts d'extensions contenant des chiffres(Je songe à ".gl2"), vais-je causer des problèmes à ma base de registre?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] _FiletypeAssociation (Associations extension fichiers)

#11

Message par Tlem »

Non, puisque cette fonction fait la même chose que si vous utilisiez l'outil de Windows.

Par contre, si vous effectuez une association malheureuse, vous pouvez endommager votre OS qui ne saurait plus quoi faire ...
Je pense à une association sur des extensions de fichiers système tel que EXE, COM, SYS, DLL, etc... ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre