C#:System.UnauthorizedAccessException:当 File.Move 或 File.Delete [重复] 时拒绝访问路径

Posted

技术标签:

【中文标题】C#:System.UnauthorizedAccessException:当 File.Move 或 File.Delete [重复] 时拒绝访问路径【英文标题】:C#: System.UnauthorizedAccessException: Access to path is denied When File.Move or File.Delete [duplicate] 【发布时间】:2021-05-11 18:15:00 【问题描述】:

我需要创建小型控制台应用程序来将文件移动到单独的文件夹中。一切正常,我可以复制文件,直到我尝试 File.Move 或 File.Delete 文件,我捕获 System.UnauthorizedAccessException。我试过的

    从代码更改文件夹权限 从 .Net Core 切换到 .Net Framework 通过右键->安全->高级手动添加文件夹权限 试图更改文件夹的只读属性(它总是恢复为只读,我无法解决这个问题)

我不知道我还能尝试什么以及如何解决这个问题。我写的代码如下

var pngFiles = Directory.GetFiles(@"C:\Users\MSI_PC\Desktop\Test", "*.png",
            SearchOption.AllDirectories);
        foreach (var pngFile in pngFiles)
        
            Console.WriteLine(pngFile);

            var fileName = Path.GetFileName(pngFile);
            var newFolder = Path.Combine(@"C:\Users\MSI_PC\Desktop\Test",
                Path.GetFileNameWithoutExtension(fileName));
            Directory.CreateDirectory(newFolder);
            var newFileName = Path.Combine(@"C:\Users\MSI_PC\Desktop\Test",
                Path.GetFileNameWithoutExtension(fileName), fileName);
            File.Copy(pngFile, newFileName, true); //yes, I can use move and have 1 line of code instead of 2. But I need file to be copied, and this line of code works fine
            File.Delete(pngFile); // System.UnauthorizedAccessException. File.Move throws the same exception
        

【问题讨论】:

您正在更改文件夹权限,但我猜您的问题在于文件权限 可能是防病毒软件仍然打开文件来分析它,因为您只是从中读取。你说你可以使用 File.Move,这行得通吗? pngFile确切值是多少? 禁用防病毒软件是否有效?还是先休眠 20 秒再删除文件? 好吧,@LasseV.Karlsen 首先提到了它。 ;) 【参考方案1】:

试试这个代码

private void Copy()

    var pngFiles = Directory.GetFiles(@"C:\Users\Administrator\Desktop", "*.png", SearchOption.AllDirectories);
    foreach (var pngFile in pngFiles)
    
       Console.WriteLine(pngFile);

       var fileName = Path.GetFileName(pngFile);
       var newFolder = Path.Combine(@"D:\NewPic\");
       Directory.CreateDirectory(newFolder);
       string DestPath = newFolder + "\\" + fileName;
       byte[] buffer = new byte[2014 * 1024];
       using (FileStream source = new FileStream(pngFile, FileMode.Open, FileAccess.Read, FileShare.Delete))
       
           using (FileStream dest = new FileStream(DestPath, FileMode.CreateNew, FileAccess.Write, FileShare.Delete))
           
              int currentBlockSize = 0;
              while ((currentBlockSize = source.Read(buffer, 0, buffer.Length)) > 0)
              
                  dest.Write(buffer, 0, currentBlockSize);
              
              dest.Close();
           
           source.Close();
       
       File.Delete(pngFile); // System.UnauthorizedAccessException. File.Move throws the same exception
   

【讨论】:

感谢您的帮助,但它不起作用。在 File.Delete 上引发异常 我为您的问题发送了另一种方法。但是朋友说你也什么都不要。您可以使用流文件复制和删除数据。如果你愿意,我会发给你。 如何使用文件流删除文件? 文件是流式复制的,但删除方法相同

以上是关于C#:System.UnauthorizedAccessException:当 File.Move 或 File.Delete [重复] 时拒绝访问路径的主要内容,如果未能解决你的问题,请参考以下文章

C#进阶C# 泛型

C#进阶C# 匿名方法

C#进阶C# 多线程

C# 教程

[C#教程01]C# 简介

用 C# 编写 C# 编译器,先有鸡还是先有蛋?