N'Processus.StartInfo.Nom de fichier accepter les noms de fichier longs?
Dirait qu'il ne l'est pas.
Si je convertir le nom du fichier à sa valeur courte, alors le Processus.Start() fonctionne.
Process runScripts = new Process();
runScripts.StartInfo.FileName = @"C:\long file path\run.cmd";
runScripts.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
runScripts.StartInfo.UseShellExecute = true;
runScripts.StartInfo.RedirectStandardOutput = false;
runScripts.Start();
Le code ci-dessus échoue. Mais...
Process runScripts = new Process();
runScripts.StartInfo.FileName = @"C:\short\file\path\run.cmd";
runScripts.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
runScripts.StartInfo.UseShellExecute = true;
runScripts.StartInfo.RedirectStandardOutput = false;
runScripts.Start();
réussit.
J'ai réussi à contourner ce problème en convertissant le long nom de chemin d'accès à un chemin d'accès court.
Mais je suis un peu surpris de trouver cela.
Toutes les raisons, ou d'arrière-plan sur cette info?
Grâce.
mise à Jour de 1
Microsoft .NET Framework Version 2.0.50727
Quelle est la version de l' .NET framework exécutez-vous?
Microsoft .NET Framework Version 2.0.50727
Qui est dépassé. Vous devez mettre à niveau.
Mise à niveau pour résoudre un dev problème? PAS de. Pas si vous voulez que votre code à exécuter pour les autres .NET 2.0 utilisateurs. Mise à niveau pour l'utiliser plus tard? Oui.
Microsoft .NET Framework Version 2.0.50727
Qui est dépassé. Vous devez mettre à niveau.
Mise à niveau pour résoudre un dev problème? PAS de. Pas si vous voulez que votre code à exécuter pour les autres .NET 2.0 utilisateurs. Mise à niveau pour l'utiliser plus tard? Oui.
OriginalL'auteur Thushan | 2009-03-05
Vous devez vous connecter pour publier un commentaire.
À reproduire votre problème, j'ai utilisé le programme suivant:
Le code commence un nouveau processus (comme par votre exemple de code) et les rapports sur les différentes façons dont il peut ne pas s'exécuter. Vous pouvez compiler le programme en ligne de commande:
(en supposant que le test.cs est dans le répertoire courant; il permettra de créer des test.exe dans le même répertoire que le test.cs)
Comme prévu, lors de l' "C:\long chemin d'accès du fichier\run.cmd" n'existe pas, le programme ne parvient pas à:
Maintenant, nous allons créer un répertoire "C:\long chemin d'accès au fichier" et de mettre un très simple à exécuter.cmd dans:
Cependant, à ce point, j'ai été incapable de reproduire votre échec. Une fois le au-dessus de l'exécuter.cmd est en place, test.exe s'exécute correctement (c'est à dire exécuter.cmd est exécutée correctement, vous pouvez vérifier cela en regardant un fichier nouvellement créé "C:\long fichier path\run.out.txt".
J'ai couru test.exe sur Vista x64 (mon principal dev machine), Windows XP SP3 x86 (machine virtuelle), Windows Server 2008 x64 (machine virtuelle) et il fonctionne partout.
Pourriez-vous essayer d'exécuter le code ci-dessus dans votre environnement et de votre rapport si c'est un échec pour vous? De cette façon, nous permettra au moins de mettre en place le même cadre test (de même .NET programme sera d'essayer d'exécuter le même fichier de commandes dans le même endroit, pour vous comme pour moi).
OriginalL'auteur Milan Gardian
C'est curieux, j'ai reproduire le problème, effectivement, il n'exécute pas comme vous l'avez indiqué, mais la modification de cela, il a travaillé:
OriginalL'auteur Jhonny D. Cano -Leftware-
Je suis incapable de reproduire le comportement que vous décrivez. Le code suivant fonctionne pour moi.
modifier
Je suis en mesure de reproduire avec le code suivant
Ce spectacle (avec Process Monitor) ConsoleApplication.vshost.exe essaie de trouver l'exécuter.cmd dans le projet\bin\Release, System32, Système, Windows, System32\Wbem, et puis encore en certains (je suppose) variables de chemin d'accès. Il fonctionne, cependant, si j'ai mis UseShellExecute = true.
Effectivement, c'est une fonctionnalité documentée. Lors de l'utilisation de UseShellExecute=false vous devez donner le chemin complet de l'exécutable sur le nom de fichier voir msdn.microsoft.com/en-us/library/...
OriginalL'auteur sisve
J'ai réussi à réellement l'exécuter en utilisant comportement suivant.
La solution avec @ ou de prendre de la chaîne à guillemets (""") n'a pas wokred dans mon cas.
OriginalL'auteur ini18
Essayer
Bien que j'étais sûr que c'était fait automatiquement pour vous par la classe de Processus. Êtes-vous sûr de fournir le chemin d'accès correct?
OriginalL'auteur Alex Reitbort
J'ai une hypothèse.
Win32 est une limitation que les chaînes de caractères utilisé pour décrivez les noms de fichiers ne peuvent pas être plus de temps, puis MAX_PATH (260 octets) y compris la résiliation de '\0'.
Peut-être que le problème a fui en C#?
(Les tests que j'ai fait indique qu', mais je ne peux pas confirmer ce qui me dérange.)
Alors, essayez de préfixe de votre chemin avec des "\\?\". (barre oblique inverse, la barre oblique inverse, questionmark, barre oblique inverse)
I. e.
Pour plus de détails sur MAX_PATH: http://msdn.microsoft.com/en-us/library/aa365247.aspx
/Leif
C'est bizarre que vous dire, les 260 limite de caractères est "une fuite en C#". Si vous creusez dans le .Bibliothèques NET, vous verrez que tout ce qui concerne le système d'exploitation est en fait juste un wrapper autour d'un Win32 appel (à l'exclusion des Mono). À toutes fins pratiques, Win32 n'est pas seulement une API pour Windows; API de Windows. .NET ne peut pas changer cela.
Vrai, vrai. J'étais en train d'insinuer que le .NET wrappers pourrait avoir automtically commencé à utiliser le "\\?\"-astuce lors de l'appel de l'OS avec de longs chemins.
OriginalL'auteur leiflundgren
(Mise à jour)
Je pense que j'ai trouvé le problème de l'ingénierie inverse le Processus.Méthode de démarrage un peu plus. J'ai été dans le bon sens, il échoue sans avoir un WorkingDirectory ensemble.
Donc, en d'autres mots CreateProcess besoin d'une adresse workingdirectory, pas .NET (il faut vraiment le deviner à partir du nom de fichier, mais n'a évidemment pas)
En voici la preuve:
J'ai supprimé SafeFileHandle à partir du code original car il n'était pas nécessaire pour ce que nous faisons. Aussi ne commencer les drapeaux ont été mis en, mais elles sont nécessaires pour une version sans fenêtre.
Oui ils sont à la recherche à Réflecteur. En regardant à travers, il retranche le nom de fichier de tous les espaces. donc, vous devez définir le répertoire de travail, qui, je suppose, le kernel32.dll (winapi CreateProcess appel) ajoute le nom du fichier. Je n'ai pas testé avec un long chemin, si
Trim() supprime uniquement attaque et de fuite des espaces. Il n'est pas "couper dans le nom de fichier de tous les espaces".
+1 pour Ch00k commentaire. En fait, le code que vous avez fourni prouve cela DEVRAIT fonctionner SANS l'aide de WorkingDirectory, que le nom de fichier est enveloppé dans des guillemets doubles pour vous (si ce n'est déjà enveloppé).
Ouai, j'ai été un peu vite, avec le trim() conclusion, j'avais oublié que c'est seulement une gauche + droit assiette combinée.
OriginalL'auteur Chris S
Essayez ceci:
I. e. utiliser une chaîne de caractères entre guillemets pour le nom de fichier lorsque le nom de fichier avec des espaces.
Êtes-vous sûr que vous avez le droit chemin?
Yep. Je fais un Fichier.Existe et il passe.
OriginalL'auteur ageektrapped
Votre code peut échouer pour diverses raisons qui sont sans rapport avec le "long/short" problème de chemin d'accès. Vous devez ajouter l'exacte description de l'exception (y compris la pile d'appel) à votre question.
OriginalL'auteur Igor Brejc