Répertoire.Move(): l'Accès au Chemin d'accès est Refusé
Je suis en train d'écrire cette Application Windows Form en 2010 de Visual Studio à l'aide de C#.
Il y a un bouton Execute sur le formulaire, l'utilisateur aura appuyé sur le bouton, le programme va générer des fichiers et sont stockés dans la Output
dossier (qui est créé par le programme à l'aide de Directory.CreateDirectory()
)
Je veux créer une Archive du dossier pour enregistrer les fichiers de sortie de la série précédente.
Au début de chaque manche, j'ai essayer de déplacer les Output
dossier à la Archive
dossier, puis créer un nouveau Output
dossier. Ci-dessous est la fonction que j'ai couru pour déplacer le répertoire.
static void moveToArchive()
{
if (!Directory.Exists("Archive")) Directory.CreateDirectory("Archive");
string timestamp = DateTime.Now.ToString("yyyyMMddHHmms");
try
{
Directory.Move("Output", "Archive\\" + timestamp);
}
catch(Exception e)
{
Console.WriteLine("Can not move folder: " + e.Message);
}
}
Le problème que j'ai rencontré me confond beaucoup de choses...
Il y a quelques temps que je peux déplacer correctement le dossier de Sortie pour les archives, mais parfois, il échoue.
Le message d'erreur que j'ai eu de la capture de l'exception est Access to path 'Output' is denied.
J'ai vérifié que tous les fichiers dans le Output
dossier ne sont pas en cours d'utilisation. Je ne comprends pas comment l'accès est refusé, parfois, et pas tout le temps.
Quelqu'un peut m'expliquer et me montrer comment résoudre le problème?
--Edit--
Après HansPassant commentaire, j'ai modifié la fonction un peu pour obtenir le répertoire courant, utilisez le chemin d'accès complet. Cependant, je suis toujours le même problème.
La fonction ressemble maintenant à ceci:
static void moveToArchive()
{
string currentDir = Environment.CurrentDirectory;
Console.WriteLine("Current Directory = " + currentDir);
if (!Directory.Exists(currentDir + "\\Archive")) Directory.CreateDirectory(currentDir + "\\Archive");
string timestamp = DateTime.Now.ToString("yyyyMMddHHmms");
try
{
Directory.Move(currentDir + "\\Output", currentDir + "\\Archive\\" + timestamp);
}
catch(Exception e)
{
Console.WriteLine("Can not move folder: " + e.Message);
}
}
J'ai imprimé le répertoire courant, c'est juste que à quoi je m'attendais, et je suis toujours avoir de la difficulté à l'aide du chemin d'accès complet. Access to path 'C:\Users\Me\Desktop\FormApp\Output' is denied.
--Edit--
Merci à vous tous pour les réponses et les commentaires.
Je pense que certains d'entre vous rater cette partie je vais donc me stress un peu plus.
Le Répertoire.Move() parfois, le travail et échoue parfois.
Lorsque la fonction de réussir, il n'y a pas de problème. Output
dossier est déplacé à Archive
Lorsque la fonction échoue, le message d'exception que j'ai eu était Accès au chemin d'accès refusé.
- Assurez-vous qu'il existe une "Sortie" du dossier et qu'il n'existe pas de fichier nommé "Sortie" (sans extension de fichier) dans le répertoire parent
- le dossier de Sortie n'existe pas et aucun des fichiers sont nommés de Sortie. Lorsque le moveToArchive() échoue, le nouvellement créées, les fichiers de sortie ont été créés dans le Outuput dossier d'écraser les fichiers générés à partir de la série précédente.
- Ce code dépend de façon critique sur l'Environnement.CurrentDirectory définie correctement. Que se passe mal tout le temps, c'est le pire possible de la variable globale. Toujours utiliser des noms de chemin, comme c:\foo\bar\baz. Et ne comptez pas sur d'être capable d'écrire à c:\program fichiers, contrôle de compte d'utilisateur met un terme à tout ça.
- Le programme est essentiellement un exécutable, les placer dans un dossier, avec d'autres fichiers nécessaires à l'exécution de l'application (2 dll et certains fichiers d'entrée) je veux donner à l'utilisateur l'ensemble du dossier, de sorte que lorsque l'utilisateur d'exécuter le fichier exe, tous les fichiers de sortie seront dans le même dossier (pour le rendre organisé et facile pour l'utilisateur), c'est pourquoi je suis en utilisant le chemin d'accès relatif au lieu de chemin d'accès complet.
- Puis le CurrentDirectory dépend toujours de comment vous avez commencé votre programme. Le dossier où le programme se trouve n'est pas automatiquement le currentDirectory.
- veuillez voir ma mise à jour de question.
- Peut-être l'antivirus?
- antivirus et pare-feu sont à la fois hors et le problème existe toujours.
- avez-vous essayé accessign votre folderlocations au démarrage comme
System.Reflection.Assembly.GetExecutingAssembly().Location
puis l'édition de la chaîne, que vous obtenez de faire correspondre le dossier dir-vous besoin? - comme mentionné dans mon montage, j'utilise de l'Environnement.CurrentDirectory pour obtenir chemin d'accès complet, j'ai imprimé le chemin d'accès complet et c'est correct, mais l'accès nie encore.
- Est-il un fichier dans le répertoire avec un handle ouvert quelque part? Êtes-vous en vous connectant à ce répertoire ou quelqu'un d'autre, etc.? MSOffice peut avoir verrouillé un fichier. Tous les fichiers dedans avec des attributs ReadOnly? L'une des .Dll peut être chargé dans un programme en cours d'exécution.
- Avez-vous d'ouverture de dossier dans une fenêtre de l'explorateur ou dans une fenêtre d'invite de commande?
- Je suppose que le code qui génère les fichiers de ne pas fermer correctement. Il peut fonctionner parfois parce que le GC collectées & la finalisation de la balançant des descripteurs de fichier déjà. Le code qui écrit les fichiers peuvent être de l'intérêt dans ce cas.
- Merci à vous tous pour les commentaires. Je suis assez sûr que tous les fichiers sont fermés parce que je suis en utilisant 'aide' pour générer des fichiers. Je vais doubler vérifier et voir si je manque quelque chose. Merci beaucoup pour essayer d'aider.
Vous devez vous connecter pour publier un commentaire.
Merci à vous tous pour les réponses et de l'aide. J'ai compris ce que le problème a été.
C'est parce qu'il y avait un fichier qui n'est pas complètement fermé.
J'ai été vérifier les fichiers qui ont été générées, et a raté les fichiers du programme a été la lecture de.
Tous les fichiers qui ont été générés ont été complètement fermé. Il a été l'un fichier que j'ai utilisé
StreamReader
d'ouvrir, mais ne se ferme pas. J'ai modifié le code et je suis maintenant de ne pas avoir de problème, donc je me dis que furent la question a été.Merci pour tous les commentaires et les réponses, qui certainement m'aider à réfléchir et à essayer de comprendre le problème.
Voir http://windowsxp.mvps.org/processlock.htm
Parfois, vous essayez de déplacer ou de supprimer un fichier ou un dossier et de recevoir violation d'accès ou au fichier en cours d'utilisation - erreurs. Pour supprimer un fichier, vous devrez identifier le processus qui a verrouillé le fichier. Vous devez quitter le processus d'abord et ensuite supprimer le fichier particulier. Pour connaître le processus qui a verrouillé un fichier, vous pouvez utiliser l'une des méthodes décrites dans cet article.
À l'aide de Process Explorer - télécharger à partir de http://download.sysinternals.com/files/ProcessExplorer.zip
Explorateur de processus affiche des informations sur la qui gère et les Dll processus ont ouvert ou chargé.
Télécharger Process Explorer sur le site de Microsoft et exécuter le programme.
Cliquez sur le menu, et choisissez Gérer ou une DLL...
Tapez le nom de fichier (nom du fichier est verrouillé par un processus.)
Après la saisie de la phrase de recherche, cliquez sur le bouton de Recherche
Vous devriez voir la liste des demandes d'accès au fichier.
Je suis tombé sur le même problème récemment. À l'aide de PE j'avais pensé que seuls les processus à l'aide de ce répertoire a été explorer.exe. J'avais ouvert quelques fenêtres avec explorer, l'un pointant vers le répertoire parent de celui que j'ai été sur le point de déménager.
Il est apparu, après que j'ai visité ce sous-dossier, puis retournés (même à la racine!) la poignée était toujours suivi par l'explorateur, donc C# n'a pas été en mesure de le modifier de quelque façon (évolution des drapeaux, des attributs, etc.).
J'ai dû tuer que la fenêtre de l'explorateur afin de fait de C# fonctionner correctement.
Essayez ceci:
Si cela ne résout pas, peut-être vérifier/changer l'antivirus, ou un autre programme est le verrouillage d'un fichier ou le dossier.
Cela a réglé mon problème.