为什么“myFileInfo.IsReadOnly = false;”错误地设置其他属性

时间:2013-07-30 09:45:06

标签: c# .net

我在复制文件时遇到问题,因为另一个业务流程在任一文件上设置了只读标志。我不想触摸源,但始终将dest作为读/写。

这是我需要编写的简单控制台应用程序的代码:

using System.IO;

namespace TrialConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileSrc = "Src.txt";
            string fileDest = "Dest.txt";

            FileInfo destFileInfo = new FileInfo(fileDest);

            if (destFileInfo.Exists && destFileInfo.IsReadOnly)
                destFileInfo.IsReadOnly = false;

            Directory.CreateDirectory(destFileInfo.DirectoryName);
            (new FileInfo(fileSrc)).CopyTo(fileDest, true);

            destFileInfo.IsReadOnly = false;
        }
    }
}

要运行此操作,您还需要在工作目录中创建Src.txt。

当我第一次跑步时,似乎没有任何事情发生。 Dest.txt没有出现。第二次抱怨目标文件是只读的。

只有当我在资源管理器中显示隐藏和系统文件时,我才能看到Dest.txt,但它具有HSAO设置的属性(O表示在NTFS中脱机)。

为什么要设置这些附加属性?我该如何解决?

1 个答案:

答案 0 :(得分:1)

第一次在复制文件之前创建destFileInfo,它不存在,并且它的属性是'undefined'。

然后代码复制文件,现在它确实存在已定义的属性,但destFileInfo仍然具有旧数据。

当设置IsReadOnly属性时,所有属性一次性写回文件。在陈旧的destFileInfo对象中未定义的那些最终得到设置。

第二轮是试图覆盖隐藏系统文件的预期错误。

解决方案是在复制文件后调用destFileInfo.Refresh();