【问题标题】:What is the difference between File and FileInfo in C#?C# 中的 File 和 FileInfo 有什么区别?
【发布时间】:2010-11-22 10:13:47
【问题描述】:

我一直在阅读,File 类的静态方法更适合用于在文件上执行小而少的任务,例如检查文件是否存在,并且我们应该使用 FileInfo 类的实例如果我们要对特定文件执行许多操作。

我理解这一点,可以简单地盲目使用它,但我想知道为什么会有区别?

它们的工作方式是什么让它们适合不同的情况?让这两个不同的类看起来以不同的方式做同样的事情有什么意义?

如果有人能至少回答其中一个问题,那将很有帮助。

【问题讨论】:

标签: c# file


【解决方案1】:

通常,如果您对文件执行单个操作,请使用File 类。如果您对同一个文件执行多个操作,请使用FileInfo。

这样做的原因是访问文件时进行了安全检查。当您创建FileInfo 的实例时,只执行一次检查。但是,每次您使用静态 File 方法时,都会执行检查。

【讨论】:

  • 这个答案虽然可以说是正确的,但我发现它具有很大的误导性。请详细说明 .NET 堆栈遍历安全检查与 OS ACL 安全检查。两者都构成“访问文件时完成的安全检查”。
  • DirectoryInfo.Exists 和 FileInfo.Exists 有很多错误,因为它们不代表当前状态,仅代表创建信息对象时的状态。
  • @larsen 的评论非常宝贵。如果您希望 FileInfo 对象反映“当前”状态,则需要显式调用 FileInfo.Refresh。
  • File.Exists 的问题是它试图打开文件。如果另一个线程同时尝试访问该文件(在打开文件的同时),我们只能说会有不幸的后果!
【解决方案2】:

File 和 FileInfo 类的方法相似,但它们的不同之处在于 File 类的方法是 static,因此您需要传递比 @ 的方法更多的参数987654326@ 实例。

您需要这样做,因为它对特定文件进行操作;例如,FileInfo.CopyTo() 方法采用一个参数作为用于复制文件的目标路径,而 File.Copy() 方法采用两个参数作为源路径和目标路径。”

参考文献

【讨论】:

  • -1:大多数静态类/方法需要知道要作用于哪个对象;而大多数实例方法自然地作用于指定的实例。这不仅限于File 和FileInfo。
【解决方案3】:

File.Exists 的执行速度比新的 FileInfo(filePath).Exists 快得多 - 特别是在网络上并且文件确实存在的情况下。这是因为File.Exists 只会检查文件是否存在,而new FileInfo(filePath).Exists 首先构造一个FileInfo 对象,其中包含文件的所有属性(日期、大小等) (如果存在)。

根据我的经验,使用File.Exists 甚至检查网络上是否存在 10 个文件也明显更快(即 20 毫秒与 200 毫秒)。

【讨论】:

    【解决方案4】:

    File 针对一个文件的一次性操作进行了优化,FileInfo 针对同一个文件的多个操作进行了优化,但总的来说,不同的方法实现之间没有太大区别。

    如果您想比较确切的实现,请使用 Reflector 查看这两个类。

    【讨论】:

      【解决方案5】:

      可能需要 FileInfo 来处理访问控制属性。其余的是静态与实例选择,您可以选择方便的选择。

      【讨论】:

        【解决方案6】:

        文件信息:

        • 使用前需要实例化
        • 包含实例方法
        • 缓存文件信息,每次都需要调用刷新来获取文件的最新信息

        文件:

        • 无需实例化
        • 包含静态方法
        • 不缓存,因此每次使用时都会获得最新信息。

        源代码:

        【讨论】:

          【解决方案7】:

          FileInfo 是文件的一个实例,因此代表文件本身。 File 是一个实用程序类,因此可以处理任何文件

          【讨论】:

            【解决方案8】:

            是的,其中一个原因可能是,正如 Nag 所说,Files 是一个实用程序类,因此不需要创建实例。同时,作为实用程序类,每次都需要安全检查。

            另一方面,FileInfo 需要创建实例,并且此时它使用安全检查。因此,现在使用 FileInfo 执行多个操作将不会调用安全检查。

            【讨论】:

              【解决方案9】:

              最近我遇到了File.Exist 的问题,我讨厌这个功能。在我使用了Fileinfo 类Exist 函数之后,我的程序就可以正常工作了。

              实际上在开发环境File.Exist 中发生的事情运行良好,但是当它进入实时环境时,此函数会阻止文件对象,因此我收到错误访问被拒绝并且无法使用该文件。

              这是我的学习。 我永远不会使用File.Exist 方法最好是创建对象然后使用它。注意使用静态方法。

              【讨论】:

              • 说绝对是最好的建议!
              【解决方案10】:

              File 类和FileInfo 类之间的主要区别在于

              File 和 FileInfo 类的两个成员都使用 [System.Security.SecurityCritical] and [System.Security.SecuritySafeCritical] 属性进行修饰,但与 FileInfo 类 @987654321 相比,File 类具有'多重安全检查' @ 并且每次调用File 类的静态成员时都会执行检查。

              当您创建FileInfo 的实例时,只执行一次检查。

              • 除此之外,其他细微差别是File 是静态类型类,而FileInfo 是实例类型类。
              • 因此,要访问FileInfo 类的成员,您需要创建一个实例,而在File 类中,您可以直接访问其成员,而无需创建实例。
              • 如果您对同一个文件执行多个操作,使用FileInfo 实例方法而不是File 类的相应静态方法会更有效。
              • 但是,与FileInfo 类相比,File 类提供了更多方法。

              Note: Either the SecurityCriticalAttribute attribute or the SecuritySafeCriticalAttribute attribute must be applied to code for the code to perform security-critical operations.

              【讨论】:

                猜你喜欢
                • 2014-03-29
                • 2019-07-10
                • 2013-12-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-03-01
                • 1970-01-01
                • 2020-11-30
                相关资源
                最近更新 更多