Pregunta

Mientras creaba un programa de sincronización de archivos en C#, intenté crear un método copy en LocalFileItem clase que usa System.IO.File.Copy(destination.Path, Path, true) método donde Path es un string.
Luego de ejecutar este código con destino. Path = "C:\\Test2" y this.Path = "C:\\Test\\F1.txt" Recibo una excepción que dice que no tengo los permisos de archivo necesarios para realizar esta operación en C:\Prueba, pero C:\Prueba es propiedad mía (el usuario actual).
¿Alguien sabe qué está pasando o cómo solucionarlo?

Aquí está el código original completo.

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");
        }
    }
}
¿Fue útil?

Solución

Parece que ha extraviado los parámetros en File.Copy(), debería ser File.Copy(fuente de cadena, destino de cadena).

¿También es "C: est2" un directorio?No puede copiar el archivo a un directorio.Utilice algo como eso en su lugar:

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

Otros consejos

Estoy un poco adivinando aquí, pero podría ser porque:

  • Está intentando realizar operaciones de archivos en C:¿raíz?(Puede haber protección de Vista si lo está utilizando, ¿no está seguro?)
  • ¿Está intentando copiar a un directorio que no existe?
  • ¿El archivo ya existe y es posible que esté bloqueado?(es decir, no ha cerrado otra instancia de aplicación)?

Lo siento, no puedo ser de más ayuda, rara vez he tenido problemas con File.Copy.

Pude resolver el problema, Michal me indicó la dirección correcta.El problema fue que intenté usar File.Copy para copiar un archivo de una ubicación a otra, mientras que el método Copiar solo copia todo el contenido de un archivo a otro (creando el archivo de destino si aún no existe).La solución fue agregar el nombre del archivo al directorio de destino.¡Gracias por toda la ayuda!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top