0

我在复制文件时遇到问题,因为另一个业务流程在任一文件上设置了只读标志。我不想触摸源,但总是将 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 中的脱机)。

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

4

1 回答 1

1

第一次在复制文件之前创建 destFileInfo,它不存在并且它的属性是“未定义的”。

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

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

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

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

于 2013-07-30T09:45:05.730 回答