While creating a file synchronization program in C# I tried to make a method copy in LocalFileItem class that uses System.IO.File.Copy(destination.Path, Path, true) method where Path is a string.
After executing this code with destination. Path = 'C:\\Test2' and this.Path = 'C:\\Test\\F1.txt' I get an exception saying that I do not have the required file permissions to do this operation on C:\Test, but C:\Test is owned by myself (the current user).
Does anybody knows what is going on, or how to get around this?
Here is the original code complete.
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'); } } }
It seems you have misplaced the parameters in File.Copy(), it should be File.Copy(string source, string destination).
Also is ‘C:\Test2’ a directory? You can’t copy file to a directory. Use something like that instead:
;