2008-11-03 22 views
0

J'essaie d'exécuter un processus de ligne de commande (qui est l'extraction d'une archive .7z) sur un fichier qui se trouve dans un dossier temporaire sur la temp répertoire (C: \ Documents and Settings \ Utilisateur \ Local Settings \ Temp), en utilisant Process dans mon application C#.accès refusé essayer d'extraire une archive sur le dossier temporaire de l'utilisateur Windows

Je pense que l'erreur de retour de processus qui se produit en raison de "accès refusé" parce que je peux voir une win32Exception avec le code d'erreur 5 lorsque je creuse dans l'objet prcoess de .NET.

faire la même chose sur un autre emplacement a bien fonctionné avant, donc je suppose que c'est peut-être quelque chose que je ne suis pas censé faire? (Exécuter un processus pour utiliser un fichier sur le% TEMP%) peut-être que je dois passer la sécurité en quelque sorte?

Répondre

1

En supposant que vous utilisez .NET standard (pas CF/Silverlight, etc) Accès aux fichiers dans la zone temp de l'utilisateur est entièrement attendue. Je me demande si le problème n'est pas que vous avez accidentellement laissé le fichier ouvert après l'avoir créé, peut-être en n'utilisant pas un "using" ou similaire?

Je ne suggérerais probablement pas d'utiliser des variables d'environnement (% TEMP% etc) lors de l'exécution d'un processus séparé; idéalement, vous passeriez le chemin complet vers le fichier (moins de choses à se tromper ...), en vous assurant citation tous les arguments de chemin (dans le cas de l'espace) - ie donc vos arguments sont @ "..." " c: \ some path \ whatever \ tmp "" ... "(si vous voyez ce que je veux dire). Enfin, si vous extrayez des fichiers, vous devez penser au contenu existant. Path.GetTempFileName() est très bien pour la création d'un lieu unique détenteur de fichier, mais pour l'extraction d'une archive que vous voulez probablement créer un répertoire - GUIDs sont à portée de main pour cette purpoes (alors que les conflits avioding, et souvenez-vous de l'enlever par la suite):

string dir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); 
+0

merci. s'est avéré être le long nom de chemin. . Enfermant le chemin dans "résoud il une autre façon de créer le nom du répertoire temporaire est ce faire { folderName = Path.GetRandomFileName(); path = Path.Combine (Path.GetTempPath(), folderName);} while (Directory.Exists (chemin)); – Hanan

0

l'exécution du même processus en utilisant la ligne de commande (cmd) a aidé à comprendre mon problème était que j'ai spécifié les arguments de chemin au processus en utilisant long-chemin-nom.

solution à ce qui peut être trouvé ici:

standard way to convert to short path in .net