星期六, 10月 19, 2024

[C#] File.Copy - UnauthorizedAccessException

C# File.Copy overwrite 參數,一直以為把它設定為 true,目的端檔案就一定可以覆蓋過去,沒想到它也有例外情況,實務上遇上指定 overwrite 情況下,拋出 [UnauthorizedAccessException 拒絕存取路徑] Exception,肯定有對應權限情況下,在 File.Copy 官方文件 上找到線索 UnauthorizedAccessException 有下列三種情況會發生
  • 呼叫端沒有對應權限
  • 目的端檔案屬性為唯讀 (ReadOnly)
  • overwrite 為 true,目的端檔案存在且檔案屬行為隱藏 (hidden),但是來源端檔案屬性不是隱藏 (hidden)
遇上第二種情況,下面簡易紀錄

唯讀檔案

C# Code
using System.IO;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string sourceFile = @"D:\FileCopyException\Source\FileCopyException.txt";
            string DestFile = @"D:\FileCopyException\Dest\FileCopyException.txt";

            // 目的端沒有檔案,可以正常複製過去
            File.Copy(sourceFile, DestFile, true);
            // 第一次複製過去後,複製檔案會保留唯讀屬性,
            // 所以第二次複製過去,就算有 overrite 也會拋出 Exception
            File.Copy(sourceFile, DestFile, true);
        }
    }
}
執行後拋出的 Exception
未處理的例外狀況: System.UnauthorizedAccessException: 拒絕存取路徑 'D:\FileCopyException\Dest\FileCopyException.txt'。
    於 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    於 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
    於 System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)
    於 ConsoleApp1.Program.Main(String[] args) 於 D:\ConsoleApp1\Program.cs: 行 20
一開始看到 System.IO.__Error.WinIOError 以為是 IOException,還想說不是有 overrite,被自己誤導。

沒有留言:

張貼留言