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


71

我一直在阅读,File最好使用Class的静态方法在文件上执行少量任务,例如检查文件是否存在,FileInfo如果要对文件执行许多操作,则应该使用Class的实例。一个特定的文件。

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

使它们适合不同情况的工作方式是什么?使这两个不同的类看起来以不同的方式执行相同操作有什么意义?

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


1
FileInfo.Exists缓存读取这个stackoverflow.com/questions/22042353/...

Answers:


86

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

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


1
这个答案虽然可以说是正确的,但我发现它极具误导性。请详细说明.NET堆栈遍历安全性检查与OS ACL安全性检查。两者都构成“访问文件时进行的安全检查”。
Ben Voigt

19
我在DirectoryInfo.Exists和FileInfo.Exists中有很多错误,因为它们不代表当前状态,仅代表信息对象创建时的状态。
angularsen,2012年

5
@larsen的评论非常宝贵。如果希望FileInfo对象反映“当前”状态,则需要显式调用FileInfo.Refresh。
差距

4
File.Exists的问题在于它试图打开文件。如果另一个线程试图同时(在打开文件时)访问文件,则只能说会带来不幸的后果!
SepehrM 2014年

5

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

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

参考文献


4
-1:大多数静态类/方法都需要知道要对哪个对象进行操作;而大多数实例方法自然会作用于指定的实例。这不限于FileFileInfo
杰克·伯杰

4

File.Exists会执行速度远远超过一个新的 FileInfo(filePath).Exists-尤其是在网络和提供的文件确实存在。这是因为File.Exists将仅检查文件是否存在,而 对象FileInfo(filePath).Exists首先构造一个FileInfo对象,该对象包含文件(如果存在)的所有属性(日期,大小等)。

以我的经验,使用甚至检查网络上10个文件的存在都明显更快(即20ms vs 200ms)File.Exists


3

File针对文件的一次性操作进行了优化,FileInfo针对同一文件的多项操作进行了优化,但是通常不同方法的实现之间并没有太大的区别。

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


3

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


2

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


2

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

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


2

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

实际上,在开发环境中发生的事情File.Exist效果很好,但是当进入实时环境时,由于该原因,我拒绝了错误访问并且无法使用该文件,因此该功能阻止了文件对象。

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


3
绝对是最好的建议!
2013年

1

FileInfo:

  • 使用前需要实例化
  • 包含实例方法
  • 缓存有关文件的信息,您需要每次都调用Refresh以获得有关文件的最新信息

文件:

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

src:


0

File班级与FileInfo班级之间的主要区别在于

FileFileInfo类的两个成员都装饰有该[System.Security.SecurityCritical] and [System.Security.SecuritySafeCritical]属性,但是与类相比,File类具有“多重安全检查” (请参阅此处),并且每次调用该类的静态成员时都会执行检查。FileInfoFile

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.