2008-11-15 11 views
2

Juste que ... Je reçois une chaîne qui contient un chemin vers un fichier plus quelques arguments. Comment puis-je reconnaître le chemin? J'ai pensé à l'index du '.' dans le fichier ... mais je ne l'aime pas.
Qu'en est-il de l'utilisation d'expressions régulières? Est-ce que quelqu'un peut-il me montrer la bonne direction?Comment reconnaître un chemin à l'intérieur d'une chaîne

Cordialement

Edit: Les thèses sont entrées valides ...
somefile.msi/a
C: \ MonDossier \ SomeFile.exe -i -d

Je ne se soucient pas beaucoup sur les arguments faire une fois que j'ai le chemin que je vais supposer que les autres sont des arguments

+0

Quels sont les arguments acceptables et l'un d'entre eux pourrait-il également être un chemin ou un fichier? – duckworth

+0

Ce sont des entrées valides ... somefile.msi/Tous c: \ MyDire \ someFile.exe -i si – sebagomez

Répondre

1

Pour les programmes non-MSI, UninstallString est transmis à CreateProcess, vous souhaiterez probablement répliquer sa méthode de détermination du nom de fichier. Lisez http://msdn.microsoft.com/en-us/library/ms682425.aspx, en particulier les notes pour lpApplicationName et la seconde moitié de lpCommandLine.

Les programmes installés par MSI ont un système séparé (msi! MsiConfigureProduct ou msi! MsiRemovePatches).

1

Eh bien, avant de vous attaquer à trouver le chemin dans la chaîne, vous devez définir un ensemble de règles pour ce chemin dans ce contexte

C'est, pour le système d'exploitation, un nom de fichier valide: un

Puisque aucune information de répertoire est spécifié, le répertoire courant sera utilisé. Le fichier n'a pas d'extension.

Mais est toujours un nom de fichier.

Est-ce un chemin dans votre contexte? Ou voulez-vous dire quelque chose qui a aussi des informations de répertoire?

Des exemples de ce que vous devez gérer seraient utiles.

0

Si vous avez un contrôle sur la chaîne, je vous recommande de changer la façon dont il est représenté. Une façon serait d'utiliser des paramètres de type URL - par ex. fileName = myFile; arg1 = value, etc. Ensuite, il est trivial d'analyser les clés. Le problème avec tout type de schéma d'analyse brute est que les données finales ne seront pas nécessairement propres. De plus, votre nom de fichier ne va PAS nécessairement avoir des espaces, des ".", Etc. qui ne sont pas pertinents. Donc tout ce que vous décidez est susceptible de ne pas être correct à 100% du temps.

+0

Je n'ai aucun contrôle sur les chaînes entrantes – sebagomez

4

Vous ne pouvez pas, sauf si vous accédez au système de fichiers, car les chemins d'accès peuvent contenir des espaces.

Ainsi, vous pouvez tester chaque "fichier" possible à l'aide de File.Exists. Un string.Split() vous aidera ici.

+0

Ne pas faire. Piège majeur dans l'utilisation de cette méthode: Un nom inattendu provoquera l'annulation de votre vérification. Imaginez (sous Win32) créer un dossier nommé 'C: \ Program'. Cela conduirait votre méthode à supposer que C: \ Program Files n'existe pas. Crédit supplémentaire: Créez C: \ Program.exe et regardez le plaisir. –

0

Jetez un oeil à SYstem.IO.Path, vous voulez probablement GetDirectoryName (string)

6

Vous pouvez utiliser System.IO.Path, et il est des méthodes statiques.

bool isPath = System.IO.Path.GetDirectoryName(@"C:\MyFolder\SomeFile.exe -i -d") != String.Empty; 
if (isPath) 
{ 
    Console.WriteLine("The string contains a path"); 
} 

La classe statique Path a plusieurs autres méthodes qui sont utiles aussi bien, comme .GetFilename, .GetExtension et .GetPathRoot.

Vous pouvez également utiliser probablement System.IO.Directory et System.IO.File pour des fonctionnalités supplémentaires.

1

La méthode normale dans ce cas est de tokeniser par des espaces (et d'utiliser des guillemets pour un nom de fichier avec des espaces). Ensuite, utilisez/ou - pour les arguments. Je pense que vous feriez mieux d'utiliser un format standard accepté que de travailler uniquement pour un sous-ensemble de cas.

0

merci à tous pour les réponses .. il ya quelques messages que je voudrais marquer comme la réponse ... que faites-vous dans ces cas? Au cas où quelqu'un voudrait voir sur quoi je travaille, c'est une petite application utilisée pour désinstaller des logiciels de mon ordinateur. J'ai posté le code, alors n'hésitez pas à le télécharger et à y jeter un coup d'œil.
La raison de cet article est un bon moyen d'implémenter la méthode private ProcessStartInfo GetProcessInfo(string uninstallString).

La raison de ce projet est affiché here ...

+0

Je suppose que je vais marquer comme la réponse la plus votée post – sebagomez

1

Mmm, je crois que le seul moyen fiable de le faire est d'accéder au système de fichiers, il est accessible en supposant.
Je couperais la chaîne sur les espaces, à partir de la fin, et prend le plus long qui existe sur le système de fichiers.

Par exemple:.

C:\My Folder\Some File.exe -i -d 
=> 
C:\My Folder\Some File.exe -i -d (no, although it might exist!) 
C:\My Folder\Some File.exe -i (no) 
C:\My Folder\Some File.exe  (yes => That's this one) 

Vous devez prendre en compte les chemins relatifs et les fichiers dans le PATH (comme votre premier exemple, à savoir tous les fichiers exe - pire encore, vous pouvez écrire foo.exe ou sur foo la ligne de commande!).

De plus, vous pouvez souvent écrire des trucs comme notepad/p, ce qui ne simplifie pas l'algorithme, sachant que C:/windows/notepad.exeest un chemin valide dans XP! :-)

Questions connexes