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

 Delphi Discussion :

Test de validité d'un nom de répertoire


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut Test de validité d'un nom de répertoire
    Bonjour,

    quand on utilise ForceDirectories avec une chaine vide ou contenant des caractères invalides on a une exception.

    J'aurai voulu, avant d'appeler cette fonction tester la validité de la chaine contenant le nom du supposé répertoire.

    J'ai trouvé ceci sur le forum Java , qui semblait satisfaire l'auteur :

    Tester validité d'un chemin

    Mais évidement en Delphi cela ne compile pas.

    Quelqu'un pourrait il me le traduire en Pascal ou bien me donner une autre solution équivalente ?

    Merci

    Charly

    [D7] Win32 uniquement

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 628
    Points : 10 553
    Points
    10 553
    Par défaut
    Je pense que la version en C c'est avec GetFileAttributes

    Il faut que le retour soit différent de "INVALID_FILE_ATTRIBUTES" (appel réussi) et que le retour contienne au moins (avec un ou logique) FILE_ATTRIBUTE_DIRECTORY


    Ensuite en Delphi , on me dit que c'est System.IOUtils.TFile.GetAttributes
    À tester


    Édit: Moi, j'évite ces attributs, parce que c'est le gros bordel et tu ne sais pas quoi tester et après savoir si ton test est valide ou pas : compatibilité Microsoft

  3. #3
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Salut,
    quand on utilise ForceDirectories avec une chaine vide ou contenant des caractères invalides on a une exception.
    comment utilises-tu ForceDirectories ?
    parce-que j'arrive pas a avoir d'exception !!!

    Edit: oui j'ai réussi ... en passant une chaine vide on obtient bien une exception
    mais il suffit de tester la chaine passée à ForceDirectories avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      aDir := 'c:\le cas: repertoire';
      if aDir <> EmptyStr then
        if not ForceDirectories(aDir) then
          ShowMessage('La création du répertoire a échouée'#13+
                      'Motif:'#13+ SysErrorMessage(GetLastError));
    Ajout: Message d'erreur

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Merci à tous les 2,

    c'est vrai, il n'y a que la chaine vide à tester. Une chaine contenant des caractères invalide ne déclenche pas une exception. J'avais mal testé !

    Je vais dons juste tester la chaine vide

    A+
    Charly

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Ah, là j'ai quand même une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Aux := '??**' ;  
        If Not ForceDirectories(Aux) Then
          Begin
             MessageDlg('Nom de répertoire incorrect', mtInformation,[mbOk], 0);
             E_Chemin.setFocus ;
             ChampsOk := False ;
             Exit ;
          End ;
    Charly

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Pour GetAttributes :

    GetAttributes raises an exception if the file cannot be accessed or the path is invalid.
    donc cela revient au même que pour ForceDirectories ?

    A+
    Charly

  7. #7
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    sinon, si tu n'as qu'un seul répertoire a créer (par chemin)
    tu peux utiliser CreateDirectory:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      aDir := '??**';
      if not CreateDirectory(PChar(aDir), nil) then
        ShowMessage('La création du répertoire a échouée'#13+
                    'Motif:'#13+ SysErrorMessage(GetLastError));
    l'avantage de ForceDirectories c'est d'être récursif

    autre solution
    c'est de gerer l'exception par code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      if aDir <> EmptyStr then
      try
        if not ForceDirectories(aDir) then
          ShowMessage('La création du répertoire a échouée'#13+
                      'Motif:'#13+ SysErrorMessage(GetLastError));
      except
        // ici traitement silencieux
        // j'affiche volontairement le message d'erreur ;)
        ShowMessage('La création du répertoire a échouée'#13+
                      'Motif:'#13+ SysErrorMessage(GetLastError));
      end;
    Bien sûr en mode Debug dans l'IDE tu seras averti de l'exception mais pas en dehors.

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Merci Cirec,

    mais je crois que je vais faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    { ========================================================================== }
    function IsValidDirectory(pathName : string) : boolean;
    Begin
    if AnsiIndexStr ( PathName, ['|','*','?','<','>','"','/','¨','^']) >= 0 then
               Result := True
          Else Result := False ;
    End ;
    { ========================================================================== }
    ce n'est pas parfait, et lever l'exception est mieux, mais comme tu dis cela m'embête en mode Debug

    A+
    Charly

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Merci Cirec,

    mais je crois que je vais faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    { ========================================================================== }
    function IsValidDirectory(pathName : string) : boolean;
    Begin
    if AnsiIndexStr ( PathName, ['|','*','?','<','>','"','/','¨','^']) >= 0 then
               Result := True
          Else Result := False ;
    End ;
    { ========================================================================== }
    ce n'est pas parfait, et lever l'exception est mieux, mais comme tu dis cela m'embête en mode Debug

    A+
    Charly
    avec ce code même un chemin valide est invalide !!!

    normal, AnsiIndexStr n'est pas fait pour cela il ne fait pas de comparaison par caractère

    l'exception en mode Debug n'est pas trop gênante d'autant plus que tu ne vas pas lui balancer une tonne de chemin invalide ...
    théoriquement ce n'est que pour gérer l'action de l'utilisateur final

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Oui tu as raison !!

    je vais prendre ta solution

    merci
    A+
    Charly

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    System.IOutils.TPath.HasValidPathChars

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    puisqu'il s'agit de D7, certaines options ne sont pas possible toutefois avec un petit ajout (l'unité PerlRegEx) il serait possible d'utiliser des expressions régulières (ma marotte depuis quelques temps )
    ici dans la FAQ un exemple avec date
    et l'expression : quelque chose de ce genre '^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$' (non garanti mais un peu de recherche sur le net devrait donner la bonne réponse)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    oops , je n'avais pas vu le D7, désolé

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    Bonsoir !

    Étant comme SergioMaster atteint du virus des expressions régulières, je me suis amusé à écrire le code suivant. Comme on le voit dans les résultats du test, l'expression est à peaufiner mais l'idée est là.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    program validpath1;
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      Classes,
    {$IF CompilerVersion >= 22.0}
      RegularExpressionsCore;
    {$ELSE}
      PerlRegex; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *)
    {$IFEND}
     
    function IsValidPath(const s: string): boolean;
    const
      REGEX =
        '^' +
          '[A-Za-z]:' +
          '(' +
            '\\' +
            '[\w\s\(\)]+' +
          '|' +
            '\\' +
          ')*' +
          '\\?' +
        '$';
    var
      expr: TPerlRegex;
    begin
      expr := TPerlRegex.Create;
      expr.Subject := utf8string(s);
      expr.RegEx := REGEX;
      result := expr.Match;
      expr.Free;
    end;
     
    const
      ROOT = 'C:\Program Files (x86)\';
     
    var
      SR: TSearchRec;
     
    begin
      if FindFirst(ROOT + '*.*', faAnyFile, SR) = 0 then
      try
        repeat
          if SR.Attr and faDirectory = faDirectory then
            if (SR.Name <> '.') and (SR.Name <> '..') then
              WriteLn(Format(
                '%-70s %10s',
                [
                  ROOT + SR.Name,
                  BoolToStr(
                    IsValidPath(ROOT + SR.Name),
                    TRUE
                  )
                ]
              ));
        until FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
    end.
    Code X : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    C:\Atelier\Pascal\regularexpressions\perlregex>validpath1
    C:\Program Files (x86)\4inaRow                                               True
    C:\Program Files (x86)\AbcNavigator 2                                        True
    C:\Program Files (x86)\Adobe                                                 True
    C:\Program Files (x86)\AIR Examples                                          True
    C:\Program Files (x86)\AjedrezLucas                                          True
    C:\Program Files (x86)\AMD                                                   True
    C:\Program Files (x86)\AMD AVT                                               True
    C:\Program Files (x86)\Anvil Studio 2015                                     True
    C:\Program Files (x86)\Any Flash Screensaver Maker                           True
    C:\Program Files (x86)\Application Verifier                                  True
    C:\Program Files (x86)\Arasan                                                True
    C:\Program Files (x86)\ATI Technologies                                      True
    C:\Program Files (x86)\Borland                                               True
    C:\Program Files (x86)\C-Free 5                                             False
    C:\Program Files (x86)\C-Free Standard                                      False
    C:\Program Files (x86)\CheckerBoard                                          True
    C:\Program Files (x86)\ChessBase                                             True
    C:\Program Files (x86)\CodeLite                                              True
    C:\Program Files (x86)\Common Files                                          True
    C:\Program Files (x86)\Corona Labs                                           True
    C:\Program Files (x86)\DA-Software                                          False
    C:\Program Files (x86)\DelphiSWFSDK                                          True
    C:\Program Files (x86)\DOSBox-0.74                                          False
    C:\Program Files (x86)\Embarcadero                                           True
    C:\Program Files (x86)\FileZilla FTP Client                                  True
    C:\Program Files (x86)\GExperts for Delphi 7                                 True
    C:\Program Files (x86)\GExperts for RAD Studio XE2                           True
    C:\Program Files (x86)\GhostScript                                           True
    C:\Program Files (x86)\Hewlett-Packard                                      False
    C:\Program Files (x86)\HP                                                    True
    C:\Program Files (x86)\HTML Help Workshop                                    True
    C:\Program Files (x86)\ImageMagick-6.9.1-Q16                                False
    C:\Program Files (x86)\Infogrames Interactive                                True
    C:\Program Files (x86)\Inkscape                                              True
    C:\Program Files (x86)\InstallShield Installation Information                True
    C:\Program Files (x86)\Internet Explorer                                     True
    C:\Program Files (x86)\Java                                                  True
    C:\Program Files (x86)\Kvetka                                                True
    C:\Program Files (x86)\LEGO Company                                          True
    C:\Program Files (x86)\Ligos                                                 True
    C:\Program Files (x86)\Lokasoft                                              True
    C:\Program Files (x86)\Lua                                                   True
    C:\Program Files (x86)\LucasChess                                            True
    C:\Program Files (x86)\MarioForever                                          True
    C:\Program Files (x86)\Mayura Software                                       True
    C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2                            False
    C:\Program Files (x86)\Microsoft Help Viewer                                 True
    C:\Program Files (x86)\Microsoft SDKs                                        True
    C:\Program Files (x86)\Microsoft SkyDrive                                    True
    C:\Program Files (x86)\Microsoft SQL Server                                  True
    C:\Program Files (x86)\Microsoft SQL Server Compact Edition                  True
    C:\Program Files (x86)\Microsoft Synchronization Services                    True
    C:\Program Files (x86)\Microsoft Visual Studio 10.0                         False
    C:\Program Files (x86)\Microsoft Visual Studio 12.0                         False
    C:\Program Files (x86)\Microsoft Visual Studio 14.0                         False
    C:\Program Files (x86)\Microsoft.NET                                        False
    C:\Program Files (x86)\Milestone                                             True
    C:\Program Files (x86)\Minecraft                                             True
    C:\Program Files (x86)\Morris                                                True
    C:\Program Files (x86)\Mozilla Firefox                                       True
    C:\Program Files (x86)\Mozilla Maintenance Service                           True
    C:\Program Files (x86)\MSBuild                                               True
    C:\Program Files (x86)\Mundo                                                 True
    C:\Program Files (x86)\MuseScore 2                                           True
    C:\Program Files (x86)\Notepad++                                            False
    C:\Program Files (x86)\NSIS Uninstall Information                            True
    C:\Program Files (x86)\Online Services                                       True
    C:\Program Files (x86)\OpenOffice 4                                          True
    C:\Program Files (x86)\PascalABC.NET                                        False
    C:\Program Files (x86)\PellesC                                               True
    C:\Program Files (x86)\Postcode                                              True
    C:\Program Files (x86)\Realtek                                               True
    C:\Program Files (x86)\Reference Assemblies                                  True
    C:\Program Files (x86)\RemObjects Software                                   True
    C:\Program Files (x86)\Resource Hacker                                       True
    C:\Program Files (x86)\Samsung                                               True
    C:\Program Files (x86)\sapin_flashsaver                                      True
    C:\Program Files (x86)\Skype                                                 True
    C:\Program Files (x86)\SourceFormatX                                         True
    C:\Program Files (x86)\Steam                                                 True
    C:\Program Files (x86)\Subversion                                            True
    C:\Program Files (x86)\SuperMarioPac                                         True
    C:\Program Files (x86)\Symantec                                              True
    C:\Program Files (x86)\SymSilent                                             True
    C:\Program Files (x86)\SystemRequirementsLab                                 True
    C:\Program Files (x86)\Tarrasch                                              True
    C:\Program Files (x86)\Temp                                                  True
    C:\Program Files (x86)\TUSA                                                  True
    C:\Program Files (x86)\Wincy                                                 True
    C:\Program Files (x86)\Windows Defender                                      True
    C:\Program Files (x86)\Windows Kits                                          True
    C:\Program Files (x86)\Windows Live                                          True
    C:\Program Files (x86)\Windows Mail                                          True
    C:\Program Files (x86)\Windows Media Player                                  True
    C:\Program Files (x86)\Windows Multimedia Platform                           True
    C:\Program Files (x86)\Windows NT                                            True
    C:\Program Files (x86)\Windows Photo Viewer                                  True
    C:\Program Files (x86)\Windows Portable Devices                              True
    C:\Program Files (x86)\Windows Sidebar                                       True
    C:\Program Files (x86)\WindowsPowerShell                                     True
    C:\Program Files (x86)\WinLemm                                               True
    C:\Program Files (x86)\WZebra                                                True
    C:\Program Files (x86)\XSB                                                   True
    
    C:\Atelier\Pascal\regularexpressions\perlregex>
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  15. #15
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Bonjour,

    merci beaucoup, mais j'ai peur de ne pas savoir me débrouiller avec PerlRegEx : il y a un tas de .obj dans pcre (les .obj je connaissais avec Fortran !)

    Comme j'ai un besoin très limité, je reste sur cette solution :

    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
    { ========================================================================== }
    function IsValidDirectory(PathName : string) : boolean;
    Var
       Lettre : Char    ;
       i      : Integer ;
    Begin
       Result := True ;
       For i := 1 To Length(PathName) Do
          Begin
             Lettre := PathName[i] ;
             if not AnsiIndexStr ( Lettre, ['|','*','?','<','>','"','/','¨','^']) >= 0 then
                        Result := False ;
          End ;
    End ;
    { ========================================================================== }
    Dès que j'ai un peu de temps j'essaye quand même les autres solutions (si j'arrive à compiler PerlRegEx)
    Merci encore pour vos réponses

    A+
    Charly

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par Roland Chastain Voir le message
    Étant comme SergioMaster atteint du virus des expressions régulières, je me suis amusé à écrire le code suivant. Comme on le voit dans les résultats du test, l'expression est à peaufiner mais l'idée est là.
    et joli "amusement"
    il semblerait que le résultat "faux" viennent des caractères [.-+]
    dans ce lien sur un livre (cookbook)
    il semble y avoir quelque chose de plus complet comprenant en plus semble t-il les chemins virtuels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\/:*?"<>|↵\r\n]+\\?)(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$'
    cependant ne maitrisant pas Perl regex je ne comprend pas les ● peut être remplacent-ils un \+ (échappement +)

    en tout j'ai rapidement testé (sans ton programme Roland mais avec Expresso) cette expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^(?:(?:[a-z]:|\\\\[a-z0-9_.$+-]+\\[a-z0-9_.$+-]+)\\|\\?[^\\/:*?"<>|\r\n]+\\?)(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$'
    sur ta liste un peu raccourcie et un peu modifiée pour tester plus d'un répertoire (1° ligne)
    C:\Program Files (x86)\4inaRow\toto\est\souvent\utilisé\par les programmeurs
    C:\Program Files (x86)\AbcNavigator 2
    C:\Program Files (x86)\Adobe
    C:\Program Files (x86)\AIR Examples
    C:\Program Files (x86)\AjedrezLucas
    C:\Program Files (x86)\AMD
    C:\Program Files (x86)\AMD AVT
    C:\Program Files (x86)\Anvil Studio 2015
    C:\Program Files (x86)\Any Flash Screensaver Maker
    C:\Program Files (x86)\Application Verifier
    C:\Program Files (x86)\Arasan
    C:\Program Files (x86)\ATI Technologies
    C:\Program Files (x86)\Borland
    C:\Program Files (x86)\C-Free 5
    C:\Program Files (x86)\C-Free Standard
    C:\Program Files (x86)\CheckerBoard
    C:\Program Files (x86)\ChessBase
    C:\Program Files (x86)\CodeLite
    C:\Program Files (x86)\Common Files
    C:\Program Files (x86)\Corona Labs
    C:\Program Files (x86)\DA-Software
    C:\Program Files (x86)\DelphiSWFSDK
    C:\Program Files (x86)\DOSBox-0.74
    C:\Program Files (x86)\Embarcadero
    C:\Program Files (x86)\FileZilla FTP Client
    C:\Program Files (x86)\GExperts for Delphi 7
    C:\Program Files (x86)\GExperts for RAD Studio XE2
    C:\Program Files (x86)\GhostScript
    C:\Program Files (x86)\Hewlett-Packard
    C:\Program Files (x86)\HP
    C:\Program Files (x86)\HTML Help Workshop
    C:\Program Files (x86)\ImageMagick-6.9.1-Q16
    C:\Program Files (x86)\Infogrames Interactive
    C:\Program Files (x86)\Inkscape
    C:\Program Files (x86)\InstallShield Installation Information
    C:\Program Files (x86)\Internet Explorer
    C:\Program Files (x86)\Java
    C:\Program Files (x86)\Kvetka
    C:\Program Files (x86)\LEGO Company
    C:\Program Files (x86)\Ligos
    C:\Program Files (x86)\Lokasoft
    C:\Program Files (x86)\Lua
    C:\Program Files (x86)\LucasChess
    C:\Program Files (x86)\MarioForever
    C:\Program Files (x86)\Mayura Software
    C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2
    C:\Program Files (x86)\Microsoft Help Viewer
    C:\Program Files (x86)\Microsoft Visual Studio 10.0
    C:\Program Files (x86)\Microsoft.NET
    C:\Program Files (x86)\Notepad++
    C:\Program Files (x86)\XSB
    mais avec des "false" selon ton expression, avec celle que je propose tout passe
    reste le Alt+0255 chers à certains vieux de la vieille pour que l'expression soit au point je pense
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  17. #17
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    merci beaucoup, mais j'ai peur de ne pas savoir me débrouiller avec PerlRegEx : il y a un tas de .obj dans pcre (les .obj je connaissais avec Fortran !)

    Comme j'ai un besoin très limité, je reste sur cette solution :

    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
    { ========================================================================== }
    function IsValidDirectory(PathName : string) : boolean;
    Var
       Lettre : Char    ;
       i      : Integer ;
    Begin
       Result := True ;
       For i := 1 To Length(PathName) Do
          Begin
             Lettre := PathName[i] ;
             if not AnsiIndexStr ( Lettre, ['|','*','?','<','>','"','/','¨','^']) >= 0 then
                        Result := False ;
          End ;
    End ;
    { ========================================================================== }
    Dès que j'ai un peu de temps j'essaye quand même les autres solutions (si j'arrive à compiler PerlRegEx)
    Merci encore pour vos réponses

    A+
    Charly


    http://www.regular-expressions.info/delphi.html

    pour d'anciennes versions

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    AMHA seule la classe suffit
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Avec le code de Roland et l'expression de Sergio tout est "False" !!!

    avec celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      REGEX = '^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$';
    tout est "True" mais j'ai pas testé à fond

  20. #20
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 119
    Points
    3 119
    Par défaut
    Bonjour,

    j'ai testé les expressions régulière. Finalement, ce n'est pas compliqué à mettre en œuvre et c'est magique ! Merci SergioMaster

    Finalement, la dernière expression de Cirec marche bien. J'ai testé des noms valides et invalides (voir mon fichier joint ValidPath.zip )

    les caractères interdits sont : < > " | * ? /

    Par contre, il faudrait surement ajouter les caractères Ascii 0 à 31 (je ne sais pas comment les mettre dans le REGEX)

    Il faudrait aussi ajouter les chaines se terminant par .

    Si on voulait perfectionner la fonction IsValidPath, il faudrait aussi détecter le système de fichier (FAT ou NTFS). En FAT les caractères [ ] = ; , sont interdits.

    je vais déjà essayer d'ajouter le . en fin de chaine

    A+
    Charly

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Possiblité d'utiliser des noms de répertoires
    Par vicelard dans le forum Access
    Réponses: 4
    Dernier message: 27/10/2005, 11h04
  2. Lire le nom du répertoire courant !
    Par Feustine dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2005, 14h33
  3. nom de répertoire contenant des accents
    Par isa38 dans le forum Windows
    Réponses: 6
    Dernier message: 21/07/2005, 10h27
  4. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  5. [debutant][bean] test de validité d'un champs
    Par LoLoSS dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/05/2004, 12h16

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