2008-08-23 13 views
7

bien la creación de un programa de sincronización de archivos en C# Traté de hacer un método copy en LocalFileItem clase que utiliza System.IO.File.Copy(destination.Path, Path, true) método en el Path es una string.
Después de ejecutar este código con el destino. Path = "C:\\Test2" y this.Path = "C:\\Test\\F1.txt" me sale una excepción diciendo que no tengo los permisos de archivo necesarios para realizar esta operación en C: \ Prueba, pero C: \ Prueba es propiedad de mi mismo (el usuario actual).
¿Alguien sabe qué está pasando o cómo evitarlo?acerca de los permisos de archivos en C#

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"); 
     } 
    } 
} 

Respuesta

3

Parece que ha perdido los parámetros de File.Copy(), debe ser File.Copy (cadena fuente, destino cadena).

También está el directorio "C: \ Test2"? No puedes copiar el archivo a un directorio. Use algo así en su lugar:

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

0

Soy un poco una suposición, pero podría ser porque:

  • usted está tratando de realizar operaciones de archivo en C: root? (puede que haya una protección en Vista si lo está usando, ¿no está seguro?)
  • ¿Está intentando copiar a un directorio no existente?
  • ¿El archivo ya existe y puede estar bloqueado? (es decir, si 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.

0

Pude resolver el problema, Michal me indicó la dirección correcta. El problema fue que traté de usar File.Copy para copiar un archivo de una ubicación a otra, mientras que el método Copy solo copió todos los contenidos 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!

Cuestiones relacionadas