如何轻松检查 .NET 中的文件访问是否被拒绝?

2024-01-04

基本上,我想在实际尝试打开文件之前检查我是否有权打开该文件;除非必须,否则我不想使用 try/catch 进行此检查。是否有我可以事先检查的文件访问属性?


过去我已经做过无数次这样的事了,但几乎每次我的尝试都是错误的。

文件权限(甚至文件存在)是volatile——他们可以随时改变。感谢墨菲定律尤其包括您检查文件和尝试打开文件之间的短暂时间。还有其他原因可能会失败,例如锁定或网络可用性和路径解析。如果您知道自己需要先检查的区域,则更有可能出现错误的结果。但奇怪的是,它永远不会在您的测试或开发环境中发生,因为这些环境往往相当静态。这使得问题很难在以后追踪,并且使得此类错误很容易进入生产。

这意味着,尽管您进行了检查,但如果文件权限或存在问题,您仍然必须准备好处理异常。异常处理代码是required,无论你是否提前检查文件,良好的异常处理程序都可以提供all存在或权限检查的功能。

但是异常处理不是很慢吗?我很高兴你问了。是的。是的。事实上,展开堆栈来处理异常是在单台计算机中可以做的最慢的事情。然而,重要的是要记住磁盘 I/O 甚至更慢 —lot较慢 - 并调用.Exists()函数或检查权限总是会强制在文件系统上进行额外的 I/O 操作。

因此,我们发现在尝试打开文件之前进行初始检查既多余又浪费。与异常处理相比,没有额外的好处。它实际上会损害而不是帮助你的表现。它增加了必须维护的更多代码的成本。最后,它可能会引入微妙的错误。进行初步检查根本没有任何好处。

相反,这里正确的做法是立即尝试打开文件,而不进行初始检查,并在失败时将精力投入到良好的异常处理程序中。无论您是在检查权限、锁定,甚至只是检查文件是否存在,情况都是如此。

总之:选择是每次使用更多代码为文件检查支付(大量)额外成本,或者仅在某些时间使用更少代码为异常处理支付较小但仍然很糟糕的成本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何轻松检查 .NET 中的文件访问是否被拒绝? 的相关文章

  • crt0 是否加载 msvcrt.dll?

    我想弄清楚标准 C 函数是什么样的printf 在 Windows 环境下加载到内存中 我知道crt0 obj准备堆栈 调用int main int argc char argv 然后使用 main 返回的退出代码退出进程 我还听说 C 标
  • Mono C# 获取应用程序路径

    我正在寻找我的应用程序的目录 它似乎与常规 c 不同 As in Path GetDirectoryName Application ExecutablePath 不管用 一种正确的跨平台解决方案是 Path GetDirectoryNam
  • 在 Silverlight 中同步操作

    我有一个 Silverlight 应用程序 它使用操作从模型获取数据 再次从 WCF 服务获取数据 我需要以某种方式同步两个 ActionCallback 或等待它们 然后执行一些代码 Example model GetMyTypeList
  • 将项目添加到字典中作为第一个项目c# [重复]

    这个问题在这里已经有答案了 我目前正在将项目添加到字典中 如下所示 private Dictionary
  • 剃刀 2 到剃刀 3 MVC 5

    我一直在开发 MVC 4 解决方案 并且一直在尝试将其升级到 MVC 5 我已按照概述的步骤操作here http www asp net mvc tutorials mvc 5 how to upgrade an aspnet mvc 4
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • 保存到会话状态的 DataTable 丢失事件处理程序

    我有一个来自强类型数据集的数据表 该数据集在 TableNewRow 事件上有一个事件处理程序 用于初始化一些日期字段 当我将此表保存到会话状态时 事件处理程序会正常触发 直到表被序列化 在后续请求中 当我从会话状态检索表时 事件处理程序不
  • 在硬件不足的情况下进行编码

    我目前正在使用 C 中的 SIMD 指令进行编码 并尝试使用 IDE 在实时编码时显示错误 拼写错误等 问题是 我使用的是 AVX512 指令 我的硬件不支持这些指令 只有我用于编译的服务器支持 有没有一种方法可以在 IDE 中进行错误检查
  • 图像的 EMGU/OpenCV FFT 未产生预期结果

    我正在尝试使用 EMGU 可视化图像的 FFT 这是我正在处理的图像 这是预期的结果 Here s what I get 这是我的代码 Image
  • Tulpep PopupNotifier 无法与计时器一起使用

    using System using System Data SQLite using System Drawing using System Timers using System Windows Forms using Tulpep N
  • 如何在类中使用常量类变量声明常量数组?

    如何在类中使用常量类变量声明常量数组 是否可以 我不想要动态数组 我的意思是这样的 class test const int size int array size public test size 50 int main test t 5
  • 底层连接已关闭:接收时发生意外错误

    我来这里是因为我在通过 ftp 协议下载一些文件时遇到问题 这很奇怪 因为它偶尔会发生 甚至对于同一个文件也是如此 只是一个精确度 我正在下载非常大的文件 从 500 Mo 到 30Go 以下是我的函数返回的异常类型 抱歉 这是法语 Sys
  • 使用signinmanager成功登录后,用户仍然显示为已注销?

    我已将 Asp Net 身份框架添加到从前端调用的 WebAPI 中 注册帐户后 并看到它在数据库中正确显示 我使用该用户的用户名和密码登录 结果成功 但根据登录管理器 用户未登录 我尝试使用 cookie 身份验证使用此示例 https
  • C++ boost asio超时用于阻止连接

    我有一个 C boost 客户端 它执行阻塞连接并在收到响应后处理消息 我面临一个奇怪的问题 tcp resolver query query tcp v6 this gt host port tcp resolver query v4 m
  • 为什么%c前面需要加空格? [复制]

    这个问题在这里已经有答案了 下面的代码一编译就给出了奇怪的o p main char name 3 float price 3 int pages 3 i printf nEnter names prices and no of pages
  • OpenMP while 循环中的手动同步

    我最近开始使用 OpenMP 为大学的一个项目做一些 研究 我有一个矩形且均匀分布的网格 在该网格上我使用迭代方案求解偏微分方程 因此 我基本上有两个 for 循环 网格的 x 方向和 y 方向各一个 并由 while 循环包裹以进行迭代
  • 如何在 C# 中按进程获取打开文件句柄的列表?

    如何在 C 中通过进程 ID 获取打开文件句柄的列表 我也有兴趣挖掘并获取文件名 寻找与流程资源管理器所做的等效的编程 这很可能需要互操作 考虑到对此添加赏金 实现起来非常复杂 哎呀 这很难从托管代码中做到 有一个 大多数事情都可以在互操作
  • 使用 DI 将参数传递给 DbContext

    我想向 DBContext 传递一个附加参数 如下所示 string myParam xx string con connenctionstring services AddDbContext
  • C++中main函数可以调用自身吗?

    谁能告诉我下面的代码有什么问题吗 int main return main 我测试了一下 编译正确 它永远运行 幕后还有什么阴谋吗 TLDR 呼叫main导致未定义的行为 标准中使用的术语以及对程序员和编译器的影响似乎存在混淆 首先 单独的
  • 在 C++ 中,将 float 转换为 double 再转换回 float 是否给出相同的值

    假设在下面的代码中 float f1 double d1 static cast

随机推荐

  • HttpWebRequest 假装成浏览器请求?

    我有一些代码 在 Winform 应用程序中 读取this URL http www pbs gov au pbs home using HttpWebRequest GetResponse 由于某种原因 它最近开始返回500当我的应用程序
  • NSFetchedResultsController 正在加载所有行,即使我已经设置了批处理

    好的 这与这里的问题完全相同 为什么 NSFetchedResultsController 在设置获取批量大小时加载所有行 https stackoverflow com questions 7947577 why is nsfetched
  • jQuery 查找与当前页面匹配的链接

    我有以下代码试图找到与当前 url 匹配的链接 item ul ui ajax tabs li a attr href location attr pathname 但它会将所有链接更改为当前 url P 谁能帮我解决它 干杯 使用此查询
  • UIView.如何将子视图放置在其父超级视图后面

    我正在做一些 UIView 争论并且被卡住了 更改同级子视图的 z 顺序很简单 mySuperview sendSubviewToBack mySubview 将 mySubview 放置在其所有同级视图的后面 但是如何将子视图放置在其父视
  • 检测 KeyVault 中不存在的密钥的正确方法是什么

    我正在使用 2 3 2 Microsoft Azure KeyVault NuGet 中的 KeyVaultClient 使用 GetSecretAsync 我注意到如果我尝试访问不存在的机密 则会引发 KeyVaultErrorExcep
  • 使用 Python 3.10 运行单元需要安装 ipykernel

    我刚刚在我的笔记本电脑 Ubuntu 20 04 上安装了 Python 3 10 在 VS Code 中运行 Jupyter Notebook 适用于 Python 3 9 但不适用于 Python 3 10 我收到错误消息 Runnin
  • 空手道:JsonPath 通配符不起作用或部分不起作用

    JSON 文件jsonExample store book category fiction author Evelyn Waugh title Sword of Honour something 12 99 bicycle color r
  • jsonpath:JSON 路径没有值:$.id,异常:路径“id”正在应用于数组。数组不能有属性

    我尝试使用 jsonPath 读取 json 的内容 但出现错误 这里是junit测试方法 mockMvc perform get path andExpect status isOk andExpect jsonPath id is 1
  • 如何从网站执行vbscript

    我有一个 VBScript 文件 当它在计算机上时 它工作正常 我想将它放在一个 php 站点上 以便通过单击按钮来执行它 但我还没有成功 它实际上获取计算机信息 希望它能在用户的机器上运行 任何想法将不胜感激 如果或者如果有人知道如何用
  • 在 NetBeans 8.0 中调试需要 sudo 运行的 C++ 程序

    我知道这个问题在不同的网站上被问过很多次 但我找不到任何如何解决我的问题的建议 我正在 NetBeans 8 0 中使用 GCC 4 8 1 需要 直观地 调试一个访问原始设备的程序 因此我需要通过 sudo 运行它 我的项目属性设置是 运
  • 如果异步引发,事件会起作用吗?

    我有一个类的以下骨架 正如您在 TODO 注释中所看到的 我将在这里实现 AsyncEnumerator 构造 此方法将获取请求并将数据传递给另一个方法进行处理 根据流程 我想调用事件 SendMilestoneReached 或 Send
  • 哪个目录是 `brew cask install` 使用的真实位置?

    哪个目录是真实位置brew cask install uses 我想找到应用程序的真实位置 而不是符号链接 Application 您可以在可用的应用程序中找到每个应用程序的自定义命令Casks https github com caskr
  • 嵌入允许添加和删除的 Symfony2 表单集合

    在 Symfony2 中 如果我嵌入表单集合 http symfony com doc current cookbook form form collections html指向Doctrine中的多对一关系并允许添加和删除 如果我从头删除
  • 将系统属性从 Gradle 传递到 Spring Boot

    我想将某些安全敏感属性传递到我的 Spring Boot 应用程序中 我在开发过程中通过命令行和 或外部设置的系统属性通过 Gradle 启动该应用程序 我无法将这些写入 build gradle 脚本或属性文件之类的内容 因为它们将被提交
  • 快速写出png

    Summary 我想尽快编写一个 png 文件 而不用担心压缩 也就是说 我不太关心文件大小 但我确实关心写入尽可能快地发生 动机 我正在客户端使用 OpenLayers 并在后端使用 python C 制作一个基于 Web 的地图应用程序
  • 运算符重载?

    我让自己成为了一个 RSS 阅读器 它可以让我了解最新情况并通知我新节目 或者至少这就是背后的想法 我创建了一个结构体 SeasonEpisode 其中包含两个整数 季节 剧集 和一个覆盖 ToString 函数 我将最新观看的内容存储在本
  • 从文本文件中删除行的有效方法

    我需要从文本文件中删除特定行 做到这一点最有效的方法是什么 文件可能很大 超过百万条记录 更新 下面是我当前正在使用的代码 但我不确定它是否好 internal void DeleteMarkedEntries string tempPat
  • 无法在 Django 中创建自定义 __str__ 调用父级的 __str__

    尽管我知道如何制作它 并且已经搜索了比较我的代码的示例 但我不明白为什么我不能调用具有其自身的模型 str 在其父级内部调用 str 我得到一个RuntimeError maximum recursion depth exceeded in
  • 如何将列值转换为列?

    我已经浏览了 Stackoverflow 在线图书和 google 上的大量 SQL Pivot 示例 但我仍然无法弄清楚如何执行 我称之为 简单的 Pivot 操作 实施例1 https stackoverflow com questio
  • 如何轻松检查 .NET 中的文件访问是否被拒绝?

    基本上 我想在实际尝试打开文件之前检查我是否有权打开该文件 除非必须 否则我不想使用 try catch 进行此检查 是否有我可以事先检查的文件访问属性 过去我已经做过无数次这样的事了 但几乎每次我的尝试都是错误的 文件权限 甚至文件存在