C#中File和FileInfo有什么区别?

79

我一直在阅读有关File类的静态方法更适合执行一些小型和少量文件任务,例如检查文件是否存在,而如果要在特定文件上执行许多操作,则应使用FileInfo类的实例。

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

它们的工作方式有什么不同之处,使它们适用于不同的情况? 为什么需要这两个看起来以不同方式执行相同操作的不同类?

如果有人能回答其中任何一个问题,那将非常有帮助。


1
FileInfo.Exists被缓存了。阅读此内容:https://dev59.com/kGEh5IYBdhLWcg3ww11p - user5273460
10个回答

93

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

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


1
这个回答虽然可以说是正确的,但我认为它非常具有误导性。请详细说明.NET堆栈行走安全检查与操作系统ACL安全检查之间的区别。两者都构成了“访问文件时进行的安全检查”。 - Ben Voigt
24
我在使用DirectoryInfo.Exists和FileInfo.Exists时遇到了不少问题,因为它们只代表了信息对象创建时的状态,而不是当前状态。 - angularsen
9
@larsen的评论非常有价值。如果你想让FileInfo对象反映出“当前”状态,你需要明确地调用FileInfo.Refresh。 - gap
4
File.Exists 方法存在的问题在于它会尝试打开文件。如果另一个线程在同一时间尝试访问该文件(而文件正在被打开),那么后果可能很不幸! - SepehrM

5

FileFileInfo类的方法类似,但它们的区别在于File类的方法是static的,因此需要传递比你为FileInfo实例的方法更多的参数。

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

参考资料


4
大多数静态类/方法需要知道要执行操作的对象,而大多数实例方法自然地针对指定的实例进行操作。这不仅限于FileFileInfo - Jake Berger

4
File.Exists 方法的执行速度比 new FileInfo(filePath).Exists 快得多,尤其是在网络上并且文件确实存在的情况下。这是因为 File.Exists 只会检查文件是否存在,而 new FileInfo(filePath).Exists 首先会构造一个包含文件所有属性(日期、大小等)的 FileInfo 对象(如果该文件存在)。
根据我的经验,在网络上甚至只有检查 10 个文件的存在性时,使用 File.Exists 的速度明显更快(例如 20ms 对比 200ms)。

3

FileInfo是文件的实例,代表着文件本身。File是一个实用类,因此可以与任何文件一起使用。


3

File类型适用于对单个文件进行一次性操作,FileInfo类型则适用于对同一文件进行多次操作,但是总体而言,不同方法实现之间的差异并不大。

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


3

可能需要使用FileInfo处理访问控制属性。对于其余部分,这是静态与实例的选择,您可以选择方便的内容。


3

FileInfo:

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

File:

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

src:


2

是的,其中一个原因可能是,正如Nag所说,Files是一个实用类,因此不需要创建任何实例。同时,由于File是实用类,每次都需要进行安全检查。

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


2

最近我遇到了与File.Exist有关的问题,我讨厌这个函数。之后我使用了Fileinfo类的Exist函数,然后我的程序就正常工作了。

实际上,在开发环境中,File.Exist函数工作得很好,但是当它进入生产环境时,由于该函数阻塞了文件对象,所以我会收到访问被拒绝的错误并且无法使用该文件。

这是我的经验教训。 我永远不会再使用File.Exist方法,最好的方法是创建对象然后使用它。请注意使用静态方法。


3
绝对化表述总是最好的建议! - Joe Phillips

0

File类和FileInfo类的主要区别在于:

File类和FileInfo类的成员都带有[System.Security.SecurityCritical]和[System.Security.SecuritySafeCritical]属性修饰符,但是与FileInfo类相比,File类具有“多个安全检查”(点此了解),而且每次调用File类的静态成员时都会执行这些检查。

当你创建FileInfo实例时,仅执行一次检查。

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

注意:代码执行安全关键操作时,必须将SecurityCriticalAttribute属性或SecuritySafeCriticalAttribute属性应用于代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接