2008-08-23 14 views
7

Während ein Datei-Synchronisation Programm in C# Erstellen ich eine Methode copy in LocalFileItem Klasse zu machen versucht, die System.IO.File.Copy(destination.Path, Path, true) Methode verwendet, wo Path ein string ist.
Nach der Ausführung dieses Codes mit Ziel. Path = "C:\\Test2" und this.Path = "C:\\Test\\F1.txt" ich eine Ausnahme, dass ich auf C diesen Vorgang nicht die erforderlichen Zugriffsrechte zu tun haben: \ Test, aber C: \ Test von mir (der aktuelle Benutzer) gehört.
Weiß jemand, was vor sich geht oder wie man das umgehen kann?über Dateiberechtigungen in C#

Hier ist der ursprüngliche Code abgeschlossen.

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

Antwort

3

Es scheint, dass Sie die Parameter in File.Copy verlegt haben(), sollte es File.Copy (string source, string Ziel) sein.

Ist auch "C: \ Test2" ein Verzeichnis? Sie können die Datei nicht in ein Verzeichnis kopieren. Verwenden Sie stattdessen so etwas:

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

0

Ich vermute, bin irgendwie hier, aber es könnte sein, weil:

  • Sie versuchen, Dateioperationen in C auszuführen: root? (Es kann Schutz von Vista geben, wenn Sie es verwenden - nicht sicher?)
  • Sie versuchen, in ein nicht existierendes Verzeichnis zu kopieren?
  • Die Datei existiert bereits und ist möglicherweise gesperrt? (d. h. Sie haben keine andere Anwendungsinstanz geschlossen)

Sorry, ich kann nicht mehr helfen, ich habe selten Probleme mit File.Copy erlebt.

0

Ich konnte das Problem lösen, Michal wies mich in die richtige Richtung. Das Problem war, dass ich versuchte, File.Copy zu verwenden, um eine Datei von einem Ort zu einem anderen zu kopieren, während die Copy-Methode nur den gesamten Inhalt von einer Datei in eine andere kopiert (Erstellen der Zieldatei, wenn sie nicht bereits existiert). Die Lösung bestand darin, den Dateinamen an das Zielverzeichnis anzuhängen. Danke für die Hilfe!

Verwandte Themen