什么时候可以检查文件是否存在?

2023-12-10

文件系统是易失性的。这意味着您不能相信一个操作的结果对于下一个操作仍然有效,即使它是下一行代码。你不能只说if (some file exists and I have permissions for it) open the file,你不能说if (some file does not exist) create the file。你的结果总是有可能if条件将change在代码的两部分之间。这些操作是不同的:不是原子的。

更糟糕的是,问题的本质意味着,如果您想进行此检查,您很可能已经担心或意识到文件可能会发生您无法控制的事情。开发环境的性质使得该事件在测试期间不太可能发生并且很难重现。所以你不仅有一个错误,而且这个错误在测试时不会出现。

因此,在正常情况下,最好的做法是不要尝试检查文件或目录是否存在。相反,将开发时间投入到处理文件系统的异常上。无论如何,您都必须处理这些异常,因此这可以更好地利用您的资源。尽管异常很慢,但检查文件是否存在需要额外的磁盘访问,并且磁盘访问是much慢点。我什至有一个投票很好的answer在另一个问题中达到这个效果。

但我有一些疑问。例如,在 .Net 中,如果那真的是always确实如此,.Exists()方法一开始就不会出现在 API 中。还要考虑您的场景expect您的程序需要创建文件。我想到的第一个例子是桌面应用程序。该应用程序将默认的用户配置文件安装到其主目录,并且每个用户第一次启动该应用程序时,都会将此文件复制到该用户的应用程序数据文件夹中。它期望该文件在第一次启动时不存在。

那么什么时候可以提前检查文件是否存在(或其他属性,如大小和权限)?期待第一次尝试失败而不是成功是否是一个足够好的经验法则?


File.Exists 方法主要用于在您不打算打开文件时测试文件是否存在。例如,测试锁定文件是否存在,该文件的存在会告诉您一些信息,但其内容并不重要。

如果要打开该文件,则无论之前调用 File.Exists 的结果如何,都需要处理任何异常。因此,一般来说,在这些情况下调用它没有真正的价值。只需在 open 方法中使用适当的 FileMode 枚举值并处理任何异常,就这么简单。

编辑:尽管这是用 .Net API 表达的,但它是基于底层系统 API 的。 Windows 和 Unix 都有使用等效于 FileMode 枚举的系统调用(即 CreateFile)。事实上,在.Net(或Mono)中,FileMode 值只是传递给底层系统调用。

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

什么时候可以检查文件是否存在? 的相关文章

  • 有人还在使用客户端服务器架构吗[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我编写软件已有几十年了 现在一切都是网络 在网络出现之前 我们拥有的客户端服务器应用程序基本上是直接与数据库对话的胖客户端应用程序 它
  • 实践中的私有成员与公共成员(封装有多重要?)[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 面向对象编程的最大优点之一是封装 我们 或者至少是我 学到的 真理 之一是成员应该始终设为私有并通过访问器和修改器提供方法 从而确保验证和验证更
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 什么是 NOR 逻辑运算符?

    Is nor a 或 b a 或 b a 和 b 还有什么吗 a 或 b see http en wikipedia org wiki Logical NOR http en wikipedia org wiki Logical NOR了解
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 如何检查 AJAX 请求的真实性

    我正在设计一个网站 让用户尽快解决谜题 JavaScript 用于为每个谜题计时 当谜题完成时 毫秒数通过 AJAX 发送到服务器 如何保证服务器收到的时间不是用户伪造的 我不认为基于会话的真实性令牌 Rails 中用于表单的那种 就足够了
  • 如何将惰性变量传递给函数参数而不对其求值,除非返回

    这个问题是针对python的 尽管我不介意用户分享其他语言的经验 基本上我的问题是尝试将惰性变量传递给函数 就我而言 我可能无法控制该函数 因此无法更改它以将生成器作为输入 示例 请注意 dict get 是函数的示例 但它很可能是 foo
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 在 Windows 中更改文件所有者

    Windows下有没有类似Linux的APIchown http google com search q man 2 chown 摘自这里 http www perlmonks org node id 70562 http www perl
  • 在 Android 中创建硬链接和符号链接

    我正在创建一个应用程序 我想在其中使用 Android 外部内存文件系统中的硬链接和符号链接 我尝试过使用命令 Os link oldpath newpath Os link oldpath newpath 但是 当我尝试这样做时 我收到此
  • 在 Windows 中从文件名获取驱动器号

    是否有 Windows API 函数可以从 Windows 路径中提取驱动器号 例如 U path to file txt U path to file txt 在正确整理的同时 relative path to file txt alte
  • 评估 CRC-32 实现中的差异

    我见过相同基本 CRC 32 算法的许多不同实现 如下所示 int remain int sbox SIZESBOX int dividend int bit for dividend 0 dividend lt SIZESBOX divi
  • 文件头或一般注释

    有人对文件有结构良好的起始评论吗 我正在寻找看起来不错的东西 要么很花哨 要么很专业 我所说的一般注释是指文件顶部的注释 显示您的名称和文件的用途 像这个 hello program to print out Hello World Aut
  • 复合模式/实体系统与传统OOP

    我正在开发一个用 Java 编写的小游戏 但问题与语言无关 由于我想探索各种设计模式 所以我迷上了复合图案 http en wikipedia org wiki Composite pattern 实体系统 我最初读到的here http
  • 您编写 DSL 是为了解决什么样的问题?

    我只是对特定领域语言感到好奇 我在文章中多次看到它们 似乎它们可以用于外部保证或银行数据定义问题 所以我来SO 寻求一些具体的意见 您使用过 DSL 吗 写一个 如果是 那是什么感觉 您认为您的项目之一使用 DSL 后是否会变得更好 更高效
  • 无法访问的代码:错误还是警告? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个语言设计问题 你认为无法访问的代码 一般编程语言中 应该提出warning 即 报告问题并无论如何编译 或error 拒绝编译 我个人强
  • 代码高尔夫:莫里斯数列

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 挑战 按字符数计算的最短代码将输出莫里斯数列 http en wikipedia org wi
  • FilesystemIterator 中的顺序

    http php net manual en class filesystemiterator php http php net manual en class filesystemiterator php 我注意到FilesystemIt
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功

随机推荐

  • 如何从 python 端指定散景图的第 n 个股票代码,其中 n 是股票代码数量

    维护者的注意事项 对 Coffeescript 的支持已弃用 并将在 Bokeh 2 0 中删除 除非我弄错了 否则你只需要访问nth作为实例变量 通过放置this 在它前面 编辑 您还需要使用 粗箭头 gt 在你的过滤器中 这样this已
  • 一次循环5条记录并将其分配给变量

    我有一个包含 811 条记录的表 我想要得到一次五个记录并将其分配给变量 下次当我运行foreach循环任务进入SSIS 它将循环另外五个记录并覆盖变量 我尝试过使用光标进行操作 但找不到解决方案 任何帮助将不胜感激 我有这样的桌子 例如
  • 改造2:如何处理动态响应

    我正在尝试从此 api 获取数据 http www omdbapi com 我正在使用 Retrofit 2 并为第一个 json 创建了一个 pojo 我很好奇的是 当数据不可用时 如何将我的 pojo 转换为第二个 pojo 当有可用数
  • Azure AD 身份验证错误:用户取消了流程

    我正在尝试使用开发我们的应用程序的用户身份验证功能Azure AD并在此过程中遇到一些问题 我已经实施了client flow身份验证使用ADAL库 但当我尝试登录时出现以下错误 Error User cancelled the flow
  • 如何使图像不透明到一定程度?

    我想知道如果在图像视图中设置或设置为相对布局的背景 是否可以使图像不透明 如何使用图像视图或相对布局动态设置图像使图像不透明 或者是否有其他选项可以动态设置图像及其不透明度 我还希望同一图像可以在两个方向上旋转 并且还可以放大和缩小到任何级
  • Python urllib2 无法在备用端口(不是 80)上打开 localhost?错误10013

    这是我的服务器 py import BaseHTTPServer import SocketServer class TestRequestHandler BaseHTTPServer BaseHTTPRequestHandler def
  • FabricJS:垂直对齐文本中心

    我使用的是fabricjs 1 5 并且我一直坚持垂直对齐行中间的文本 我正在使用此代码来设置行高 text setProperty lineHeight scope lineHeight current 它更改画布上文本的行高 但文本始终
  • C++ 中的多语句宏

    In C 是否有可能制作一个多语句宏 with 嵌套 if 语句里面像下面这样吗 我已经尝试了一段时间了 但我遇到了第二个 if 语句无法看到 的范围问题symbol 也许我需要进一步了解宏 define MATCH SYMBOL symb
  • Cassandra 存储桶拆分以调整分区大小

    我对 Cassandra 很陌生 我刚刚通过 Datastax 课程学习了它 但我在此处或互联网上没有找到足够的有关存储桶的信息 并且在我的应用程序中我需要使用存储桶来拆分数据 我有一些工具可以进行很多测量 并且每天拆分测量 时间戳作为分区
  • 点击“显示更多”按钮后如何发布新内容?

    我一直在尝试在用户点击后加载一些附加内容的区域中添加 VO 支持Show more按钮 请参阅随附的屏幕截图 所需行为 我需要 VO 宣布有关附加加载元素的信息 例如 什么是 cookie 以及另外 11 个项目 Tried 方法一 使用
  • 新 Gmail API 中的 RFC822 Message-Id

    我们尝试在使用 gmail api 发送电子邮件时手动设置 RFC822 Message Id 我们已经进行了测试 但发现 Gmail 超越了我们的价值 您知道这是否有原因吗 我们可以为此做点什么吗 是的 邮件发送的 Message Id
  • 尽管图像是正确的白色,但图像并未显示完全白色

    对于闪屏 我使用包含白色背景的图像 纯白色 在 Photoshop 中检查 由于某种原因 它显示了轻微的绿色背景与活动的默认白色背景相比 如屏幕截图中标记的那样 仅在某些设备中 例如 我将其作为框架布局中的单个视图添加到活动中
  • 哪个 zip 库可以与 Ruby 1.9.2 配合良好?

    我之前在 Ruby 1 8 7 中使用过 ruby zip gem 但我听说 ruby zip 不能很好地与 ruby 1 9 2 配合使用 哪些 zip 库适用于 Ruby 1 9 2 你是否真正尝试过使用rubyzip与1 9 2 似乎
  • 将箭头函数与 jQuery 回调一起使用时,“this”关键字的行为有所不同[重复]

    这个问题在这里已经有答案了 我有一个包含多行的表 每行上都有一个edit and delete button 简而言之 当使用 class 触发编辑按钮时 edit 弹出一个表单 除了类名之外 我还添加了一个独特的id like id ed
  • 通过无服务器框架部署到 AWS Lambda 时,将文件打包到应用程序包的特定文件夹中

    Context 我正在使用aws node typescript的例子无服务器框架 我的目标是整合Prisma进去 到目前为止 我有 使用本地创建项目serverless create 在 Railway 上设置 PostgreSQL 数据
  • 如何使用 Google Drive Node.js 断点续传

    嘿 由于 google 云端硬盘正在更改其库 我无法使用基本上传功能上传大于 5MB 的文件创建驱动器文件 文档告诉我 我必须选择可恢复上传 但谷歌驱动器没有提供任何示例代码 而且我在谷歌上找不到任何内容 也许重要的是要知道我可以使用以下命
  • getResources 不起作用/未定义 Java

    我在拨打电话时遇到问题getResources 标准类中的函数 所有导入都必须存在才能使用该功能 我需要什么特殊课程来延长我的课程吗 感谢您的立即帮助 package com example helloandroid import andr
  • 如何在Python中进行CamelCase拆分

    我想要实现的目标是这样的 gt gt gt camel case split CamelCaseXYZ Camel Case XYZ gt gt gt camel case split XYZCamelCase XYZ Camel Case
  • 编辑源文件后,“make”不会重新编译

    我正在用 C 编写康威生命游戏的一个小实现 源代码分为三个文件 main c and functions c functions h 我在其中放置函数定义和声明 现在 为了创建单元格网格 我有一个这种类型的矩阵 Cell grid GRID
  • 什么时候可以检查文件是否存在?

    文件系统是易失性的 这意味着您不能相信一个操作的结果对于下一个操作仍然有效 即使它是下一行代码 你不能只说if some file exists and I have permissions for it open the file 你不能