Сведения о вопросе

Fhohir

16:55, 11th August, 2020

Теги

c#   file   copy    

О правах доступа к файлам в C#

Просмотров: 446   Ответов: 3

При создании программы синхронизации файлов в 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 принадлежит мне (текущему пользователю) .
Кто-нибудь знает, что происходит, или как обойти это?

Вот исходный код завершен.

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



  Сведения об ответе

SEEYOU

07:09, 8th August, 2020

Похоже, вы неправильно разместили параметры в File.Copy(), это должно быть File.Copy(string source, string destination).

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

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


  Сведения об ответе

DO__IT

19:14, 1st August, 2020

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

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

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


  Сведения об ответе

ITSME

01:26, 27th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться