0

別のビジネス プロセスがいずれかのファイルに読み取り専用フラグを設定していたため、ファイルのコピーに問題がありました。ソースには触れたくありませんでしたが、常に宛先を読み取り/書き込みとして持っていました。

シンプルなコンソール アプリに切り詰めたコードは次のとおりです。

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 は表示されません。2回目は、宛先ファイルが読み取り専用であると不平を言います。

エクスプローラーで隠しファイルとシステム ファイルを表示したときだけ、Dest.txt が表示されましたが、属性 HSAO が設定されていました (O は NTFS でオフラインを意味します)。

これらの追加の属性が設定されているのはなぜですか? どうすれば修正できますか?

4

1 に答える 1

1

初めて、ファイルがコピーされる前に destFileInfo が作成されますが、存在せず、その属性は「未定義」です。

次に、コードはファイルをコピーするため、ファイルは定義された属性で存在しますが、destFileInfo にはまだ古いデータが含まれています。

IsReadOnly 属性が設定されている場合、すべての属性が一度にファイルに書き戻されます。古い destFileInfo オブジェクトで定義されていないものは、最終的に設定されます。

2 回目は、隠しシステム ファイルを上書きしようとして予期されるエラーです。

destFileInfo.Refresh();解決策は、ファイルをコピーした後に呼び出すことです。

于 2013-07-30T09:45:05.730 に答える