dotnet 6.0 C# - 访问路径被拒绝

Posted

技术标签:

【中文标题】dotnet 6.0 C# - 访问路径被拒绝【英文标题】:dotnet 6.0 C# - Access to path denied 【发布时间】:2022-01-15 20:34:39 【问题描述】:

当我尝试在我的主目录中打开一个文件时收到 UnauthorizedAccessException,该文件最初是使用下面显示的代码创建的。

该程序的初始运行将在我的主目录中创建空文件“file.txt”而不会出现问题,无论选择了 File.Open 选项(只读或写入)。当文件已经存在并且我选择只读选项时,代码也会运行。

我已经检查了文件权限,并且我对文件和目录具有完全的读/写权限。我的用户被列为文件的所有者。我尝试了不同的目录 (C:\) 并得到相同的错误。

该程序是使用最新版本的 VS Code 和 .Net 编译器 4.0.0-6.21526.21 用 C#10.0 编写的。

错误文本:

Press R for read-only or W for writeable: w
System.UnauthorizedAccessException says Access to the path 'C:\Users\johnc\Documents\Repositories\dotnet\C#10andDotNet6Book\Chapter03\file.txt' is denied.
System.UnauthorizedAccessException says
System.UnauthorizedAccessException says System.Private.CoreLib
System.UnauthorizedAccessException says    at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategy(FileStream fileStream, String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Int64 preallocationSize)
   at System.IO.File.Open(String path, FileMode mode, FileAccess access)
   at Program.<Main>$(String[] args) in C:\Users\johnc\Documents\Repositories\dotnet\C#10andDotNet6Book\Chapter03\SelectionStatements\Program.cs:line 19
System.UnauthorizedAccessException says Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, System.IO.FileOptions)

dotnet --info:

.NET SDK (reflecting any global.json):
 Version:   6.0.100
 Commit:    9e8b04bbff

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19042
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\6.0.100\

Host (useful for support):
  Version: 6.0.0
  Commit:  4822e3c3aa
.NET SDKs installed:
  3.1.415 [C:\Program Files\dotnet\sdk]
  5.0.403 [C:\Program Files\dotnet\sdk]
  6.0.100 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 3.1.21 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.21 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

全局使用:

// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

代码:

using static System.Console;

string path = $@"Environment.GetFolderPath(Environment.SpecialFolder.Personal)\Repositories\dotnet\C#10andDotNet6Book\Chapter03";

Write("Press R for read-only or W for writeable: ");
ConsoleKeyInfo key = ReadKey();
WriteLine();

Stream? s;

try

    if (key.Key == ConsoleKey.R)
    
        s = File.Open(Path.Combine(path, "file.txt"), FileMode.OpenOrCreate, FileAccess.Read);
    
    else
    
        s = File.Open(Path.Combine(path, "file.txt"), FileMode.OpenOrCreate, FileAccess.Write);
    

    string message;

    switch (s)
    
        case FileStream writeableFile when s.CanWrite:
            message = "The stream is a file that I can write to.";
            break;
        case FileStream readOnlyFile:
            message = "The stream is a read-only file.";
            break;
        case MemoryStream ms:
            message = "The stream is a memory address.";
            break;
        default:
            message = "The stream is some other type.";
            break;
        case null:
            message = "The stream is null.";
            break;
    

    WriteLine(message);

catch (Exception ex)

    WriteLine($"ex.GetType() says ex.Message");
    WriteLine($"ex.GetType() says ex.HelpLink");
    WriteLine($"ex.GetType() says ex.Source");
    WriteLine($"ex.GetType() says ex.StackTrace");
    WriteLine($"ex.GetType() says ex.TargetSite");

【问题讨论】:

您的代码对我来说运行良好。你检查目录权限了吗? 是的,一切似乎都是正确的。我的用户对以下目录和文件拥有完全权限。文件的所有权分配给我的用户。我可以使用文本编辑器(记事本)打开/更新/保存对文件的更改。有没有办法捕获 dotnet 编译器看到的权限?我想检查它是否看到我有写权限。 尝试在管理员模式下运行 【参考方案1】:

解决了!!!

Avast Antivirus File Shield 阻止了文件访问。一旦我通过病毒检查器允许了 .exe 权限,我的代码就会按预期工作。

哇,在电脑上度过了艰难的一天。是时候休息一下了!!

【讨论】:

您使用 Avast 而不是 Windows Defender 有什么特别的原因吗?只是因为我从来没有遇到过 Windows Defender 干扰我自己的软件的问题。 不,不是。几年前,我经历过一段时期,我不太信任大型科技公司。我安装了它,它似乎工作正常。老实说,最近 Avast 中的每日弹出广告开始困扰我。我只是还没生气到换成别的东西。

以上是关于dotnet 6.0 C# - 访问路径被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中访问路径被拒绝错误

Directory.Exists - 访问被拒绝 C# 的 UNC 路径

“访问路径......被拒绝”(.NET C#)

访问路径被拒绝 - C# Directory.Move

System.UnauthorizedAccessException:对路径的访问被拒绝(UWP C#)

Zipfile OpenRead 在 c# uwp 应用程序中抛出对路径的访问被拒绝异常?