Frage

Beim Erstellen eines Dateisynchronisierungsprogramms in C# habe ich versucht, eine Methode zu erstellen copy In LocalFileItem Klasse, die verwendet System.IO.File.Copy(destination.Path, Path, true) Methode wo Path ist ein string.
Nachdem Sie diesen Code mit dem Ziel ausgeführt haben. Path = "C:\\Test2" Und this.Path = "C:\\Test\\F1.txt" Ich erhalte eine Ausnahme, die besagt, dass ich nicht über die erforderlichen Dateiberechtigungen verfüge, um diesen Vorgang auszuführen C: est, Aber C: est gehört mir (der aktuelle Benutzer).
Weiß jemand, was los ist oder wie man das umgehen kann?

Hier ist der Originalcode vollständig.

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");
        }
    }
}
War es hilfreich?

Lösung

Anscheinend haben Sie die Parameter in File.Copy() falsch platziert, es sollte File.Copy(String-Quelle, String-Ziel) lauten.

Ist „C: est2“ auch ein Verzeichnis?Sie können eine Datei nicht in ein Verzeichnis kopieren.Verwenden Sie stattdessen so etwas:

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

Andere Tipps

Ich vermute hier ein bisschen, aber könnte es daran liegen:

  • Sie versuchen, Dateioperationen in C auszuführen:Wurzel?(Möglicherweise gibt es einen Schutz durch Vista, wenn Sie es verwenden – nicht sicher?)
  • Sie versuchen, in ein nicht vorhandenes Verzeichnis zu kopieren?
  • Die Datei existiert bereits und ist möglicherweise gesperrt?(d. h. Sie haben keine andere Anwendungsinstanz geschlossen)?

Leider kann ich Ihnen nicht weiterhelfen, ich hatte selten Probleme mit File.Copy.

Ich konnte das Problem lösen, Michal hat mir den richtigen Weg gezeigt.Das Problem bestand darin, dass ich versucht habe, mit File.Copy eine Datei von einem Speicherort an einen anderen zu kopieren, während die Copy-Methode nur den gesamten Inhalt von einer Datei in eine andere kopiert (wobei die Zieldatei erstellt wird, wenn sie noch nicht vorhanden ist).Die Lösung bestand darin, den Dateinamen an das Zielverzeichnis anzuhängen.Vielen Dank für all die Hilfe!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top