Question

Alors que la création d'un fichier de synchronisation programme en C# j'ai essayé de faire une méthode copy dans LocalFileItem classe qui l'utilise System.IO.File.Copy(destination.Path, Path, true) méthode où Path est un string.
Après l'exécution de ce code avec la destination. Path = "C:\\Test2" et this.Path = "C:\\Test\\F1.txt" J'obtiens une exception disant que je n'ai pas les autorisations de fichier pour effectuer cette opération sur C: est, mais C: est est détenue par moi-même (l'utilisateur actuel).
Quelqu'un sait ce qui se passe, ou comment contourner ce problème?

Voici le code d'origine complète.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Diones.Util.IO
{
    /// <summary>
    /// An object representation of a file or directory.
    /// </summary>
    public abstract class FileItem : IComparable

    {
        protected String path;
        public String Path
        {
            set { this.path = value; }
            get { return this.path; }
        }
        protected bool isDirectory;
        public bool IsDirectory
        {
            set { this.isDirectory = value; }
            get { return this.isDirectory; }
        }
        /// <summary>
        ///  Delete this fileItem.
        /// </summary>
        public abstract void delete();
        /// <summary>
        ///  Delete this directory and all of its elements.
        /// </summary>
        protected abstract void deleteRecursive();
        /// <summary>
        ///  Copy this fileItem to the destination directory.
        /// </summary>
        public abstract void copy(FileItem fileD);
        /// <summary>
        ///  Copy this directory and all of its elements
        /// to the destination directory.
        /// </summary>
        protected abstract void copyRecursive(FileItem fileD);
        /// <summary>
        /// Creates a FileItem from a string path.
        /// </summary>
        /// <param name="path"></param>
        public FileItem(String path)
        {
            Path = path;
            if (path.EndsWith("\\") || path.EndsWith("/")) IsDirectory = true;
            else IsDirectory = false;
        }
        /// <summary>
        /// Creates a FileItem from a FileSource directory.
        /// </summary>
        /// <param name="directory"></param>
        public FileItem(FileSource directory)
        {
            Path = directory.Path;
        }
        public override String ToString()
        {
            return Path;
        }
        public abstract int CompareTo(object b);
    }
    /// <summary>
    /// A file or directory on the hard disk
    /// </summary>
    public class LocalFileItem : FileItem
    {
        public override void delete()
        {
            if (!IsDirectory) File.Delete(this.Path);
            else deleteRecursive();
        }
        protected override void deleteRecursive()
        {
            Directory.Delete(Path, true);
        }
        public override void copy(FileItem destination)
        {
            if (!IsDirectory) File.Copy(destination.Path, Path, true);
            else copyRecursive(destination);
        }
        protected override void copyRecursive(FileItem destination)
        {
            Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
                Path, destination.Path, true);
        }
        /// <summary>
        /// Create's a LocalFileItem from a string path
        /// </summary>
        /// <param name="path"></param>
        public LocalFileItem(String path)
            : base(path)
        {
        }
        /// <summary>
        /// Creates a LocalFileItem from a FileSource path
        /// </summary>
        /// <param name="path"></param>
        public LocalFileItem(FileSource path)
            : base(path)
        {
        }
        public override int CompareTo(object obj)
        {
            if (obj is FileItem)
            {
                FileItem fi = (FileItem)obj;
                if (File.GetCreationTime(this.Path).CompareTo
                    (File.GetCreationTime(fi.Path)) > 0) return 1;
                else if (File.GetCreationTime(this.Path).CompareTo
                    (File.GetCreationTime(fi.Path)) < 0) return -1;
                else
                {
                    if (File.GetLastWriteTime(this.Path).CompareTo
                        (File.GetLastWriteTime(fi.Path)) < 0) return -1;
                    else if (File.GetLastWriteTime(this.Path).CompareTo
                        (File.GetLastWriteTime(fi.Path)) > 0) return 1;
                    else return 0;
                }
            }
            else
                throw new ArgumentException("obj isn't a FileItem");
        }
    }
}
Était-ce utile?

La solution

Il semble que vous avez égaré les paramètres dans le Fichier.Copier(), il convient de Fichier.Copier(string source, string destination).

Aussi, c'est "C: est2" un répertoire?Vous ne pouvez pas copier le fichier dans un répertoire.Utilisez quelque chose comme ça à la place:

File.Copy( 
    sourceFile,
    Path.Combine(destinationDir,Path.GetFileName(sourceFile))
    )
;

Autres conseils

Je suis un peu deviner ici, mais serait-ce parce que:

  • Vous essayez d'effectuer les opérations de fichier dans C:racine?(il peut y avoir de protection de la sur ce de Vista si vous l'utilisez - vous en doutez?)
  • Vous essayez de le copier à un non-existant répertoire?
  • Le fichier existe déjà et peut être verrouillé?(j'.e vous n'avez pas fermé une autre instance de l'application)?

Désolé, je ne peux pas être de plus d'aide, j'ai rarement connu des problèmes avec le Fichier.Copie.

J'ai été en mesure de résoudre le problème, Michal m'a indiqué la bonne direction.Le problème est que j'ai essayé d'utiliser le Fichier.Copier pour copier un fichier d'un emplacement à un autre, tandis que la méthode de Copie ne fait que du copier tout le contenu d'un fichier à un autre(de la création du fichier de destination s'il n'existe pas déjà).La solution est d'ajouter le nom de fichier dans le répertoire de destination.Merci pour toute l'aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top