2008-08-23 6 views
7

При создании программы для синхронизации файлов в C# Я пытался сделать метод copy в LocalFileItem класса, который использует метод System.IO.File.Copy(destination.Path, Path, true) где Path является string.
После выполнения этого кода с назначением. Path = "C:\\Test2" и this.Path = "C:\\Test\\F1.txt" я получаю исключение о том, что у меня нет необходимых прав доступа к файлам, чтобы сделать эту операцию на C: \ Test, но C: \ Test принадлежит сам (текущего пользователя).
Кто-нибудь знает, что происходит, или как обойти это?О Файл разрешения в C#

Оригинальный код завершен.

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

ответ

3

Кажется, вы потеряли параметры в File.Copy(), она должна быть File.Copy (исходная строка, строка назначения).

Также есть «C: \ Test2» в каталоге? Вы не можете скопировать файл в каталог. Используйте что-то вроде этого:

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

0

Я вроде предполагаю здесь, но это может быть потому, что:

  • Вы пытаетесь выполнить операции с файлами в C: корень? (может быть защита от этого Vista, если вы используете его - не уверен?)
  • Вы пытаетесь скопировать в несуществующий каталог?
  • Файл уже существует и может быть заблокирован? (т. е. вы еще не закрыли другой экземпляр приложения)?

Извините, что я не могу больше помочь, у меня редко возникали проблемы с File.Copy.

0

Я смог решить проблему, Михал указал мне в правильном направлении. Проблема заключалась в том, что я пытался использовать File.Copy для копирования файла из одного места в другое, в то время как метод Copy копирует все содержимое из одного файла в другой (создавая файл назначения, если он еще не существует). Решение заключалось в том, чтобы добавить имя файла в целевой каталог. Спасибо за помощь!