سؤال

أثناء إنشاء برنامج مزامنة الملفات في C# حاولت إنشاء طريقة copy في LocalFileItem الطبقة التي تستخدم System.IO.File.Copy(destination.Path, Path, true) طريقة حيث Path هو string.
بعد تنفيذ هذا الرمز مع الوجهة. Path = "C:\\Test2" و this.Path = "C:\\Test\\F1.txt" أحصل على استثناء يفيد بأنني لا أملك أذونات الملف المطلوبة لإجراء هذه العملية ج:\اختبار, ، لكن ج:\اختبار مملوكة لنفسي (المستخدم الحالي).
هل يعرف أحد ما الذي يحدث، أو كيفية التغلب على هذا؟

هنا هو الكود الأصلي كاملا.

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");
        }
    }
}
هل كانت مفيدة؟

المحلول

يبدو أنك وضعت المعلمات في غير مكانها في File.Copy()، ويجب أن يكون File.Copy(مصدر السلسلة، وجهة السلسلة).

هل "C: est2" أيضًا دليل؟لا يمكنك نسخ الملف إلى الدليل.استخدم شيئًا كهذا بدلاً من ذلك:

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

نصائح أخرى

أنا أخمن نوعًا ما هنا، لكن هل يمكن أن يكون ذلك بسبب:

  • أنت تحاول تنفيذ عمليات الملف في C:جذر؟(قد تكون هناك حماية لهذا بواسطة نظام التشغيل Vista إذا كنت تستخدمه - لست متأكدًا؟)
  • هل تحاول النسخ إلى دليل غير موجود؟
  • الملف موجود بالفعل وقد يكون مقفلاً؟(أي أنك لم تغلق مثيل تطبيق آخر)؟

آسف، لا أستطيع تقديم المزيد من المساعدة، نادرًا ما واجهت مشكلات مع File.Copy.

لقد تمكنت من حل المشكلة، وجهتني ميشال إلى الاتجاه الصحيح.كانت المشكلة أنني حاولت استخدام File.Copy لنسخ ملف من موقع إلى آخر، بينما تقوم طريقة Copy فقط بنسخ جميع المحتويات من ملف إلى آخر (إنشاء الملف الوجهة إذا لم يكن موجودًا بالفعل).كان الحل هو إلحاق اسم الملف بالدليل الوجهة.شكرا لجميع التعليمات!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top