System.IO.Path.GetFullPath & quotes (")

Signaler
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
glop glop,

je voudrais juste vérifier un petit point sur la fonction :
System.IO.Path.GetFullPath ()

si on a en entrée :
string str = ""c:\\My Application.exe"";

bah je dirais que visiblement il n'aime pas les "" qui entourent le path complet. Est ce normal ?

thx,

Vincent

----------------------------
C++ forever
C# amateur
A voir également:

15 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Bonsoir;

http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

ArgumentException, path is a zero-length string, contains only white space, or contains one or more of the invalid characters defined in GetInvalidPathChars.

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

The array returned from this method is not guaranteed to contain the complete set of characters that are invalid in file and directory names. The full set of invalid characters can vary by file system. For example, on Windows-based desktop platforms, invalid path characters might include ASCII/Unicode characters 1 through 31, as well as quote ("), less than (<), greater than (>), pipe (|), backspace (\b), null (\0) and tab (\t).

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

hum oui ca explique que ça ne marchera pas.

Maintenant la question est :
doit-on ré-inventer la roue pour traiter ces cas de figure ou bien est ce que cela existe ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Un path ne se donne pas avec des guillemets généralement, non? Il ne s'agit donc pas vraiment de réinventer la roue...
Tu peux faire passer ton string dans une Regex pour nettoyer ce qu'il faut et ensuite tu envoyes à la fonction GetFullPath.

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

Ouvre une console texte sous windows
c:
cd\
cd Pro  (et complète avec la touche TAB)
ça donne :

cd "Program Files"

ou bien la même chose :

cd c:\Pro    (TAB)
cd "c:\Program Files"
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Oui oui je sais... ;-)
Mais je n'ai pas d'autres solution à te donner... en même temps, c'est 2 lignes de codes donc....

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

pour le 1er param, oui c'est 2 lignes de code, je pense que je vais les rajouter.

C'est pour la suite que c'est plus sport chercher les doubles "", les espaces, les tab... bref un grand moment de programmation en perspective.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Avec une Regex c'est vite fait...
tout les espaces c'est \s*, un quote c'est " ...

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

Le RegEx va permettre de les supprimer mais pas de découper en morceaux non .?

----------------------------
C++ forever
C# amateur
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Tu peux aussi....
Mais une fois que c'est filtré, tu peux utiliser la fonction GetFullPath. Je ne vois pas ou est le problème finalement...

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

bah tu peux avoir le param1 entre " " mais pas le param2 mais le param 3 comme le 1.

Si on reprend l'exemple :
cd "c:\Program Files"

je ne suis pas sur que le RegEx fonctionne vu que l'on a 2 conditions différentes ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Mais si, dit moi exactement ce que tu veux faire et j'essayerai de te donner la bonne regex.

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

Alors disons que l'on veut isoler les différents arguments pour un appel de fonctions.

voici les 2 tableaux pour les jeux de test :

string[] GoodSources =
            {
                // Short path, no path
                @"./My Application",
                @"My Application.exe",
                @"My Application",

                // Environment & short path
                "%WINDIR%/My Application.exe",
                @"c:\Progra~1/My Application.exe",

                // Relative path
                "./My Application.exe -install",

                // Multi extension
                "./My Application.doc.exe -install",

                // Multi parameters
                "./My Application.doc.exe param1 param2",

                // Quotes
                @"My Application.exe 'param1'",
                @"My Application.exe 'My Test String'"
            };

            string[] BadSources =
            {
                @"c:\My Application.exe 'c:\toto.exe'",
                @"My Application.exe ""c:\toto.exe""",
                ""c:\\My Application.exe"",
                ""My Application.doc.exe"",
                ""./My Application.doc.exe" param1 param2",
                ""./My Application.doc.exe" "param1" "param2""
            };

Pour le premier, tout est bon avec les appels :
string strFileName = System.IO.Path.GetFileName(FullPath);
string strArgs = System.IO.Path.GetExtension(FullPath);
System.IO.Path.GetDirectoryName(FullPath);
System.IO.Path.GetPathRoot(FullPath);

et un peu de traitement interne.

Pour le second tableau, tout est foireux.

Allez, on s'y met une bonne fois pour toute et je pose la source complète ;p
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Peut-être qqch comme ceci:

string cleanedPath=
Regex.Replace(myPath,
"[\'|"]([^\'"]*)[\'|"]",
"$1",
RegexOptions.Singleline |
RegexOptions.IgnoreCase);

<hr />
-My Blog-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Alors?

<hr />
-My Blog-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

Voici ceux pour lesquels le résultat obtenu n'est pas celui escompté :

"My Application.exe 'param1'"  => "My Application.exe param1"
"My Application.exe 'My Test String'" => "My Application.exe My Test String"

en fait, il faut bien les supprimer mais je dois pouvoir faire le découpage de mes arguments par la suite aussi.

----------------------------
C++ forever
C# amateur