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.

InformationsquelleAutor sora0419 | 2013-09-20