我一直在阅读有关File
类的静态方法更适合执行一些小型和少量文件任务,例如检查文件是否存在,而如果要在特定文件上执行许多操作,则应使用FileInfo
类的实例。
我理解这一点,可以盲目地简单使用它,但我想知道为什么会有差异?
它们的工作方式有什么不同之处,使它们适用于不同的情况? 为什么需要这两个看起来以不同方式执行相同操作的不同类?
如果有人能回答其中任何一个问题,那将非常有帮助。
我一直在阅读有关File
类的静态方法更适合执行一些小型和少量文件任务,例如检查文件是否存在,而如果要在特定文件上执行许多操作,则应使用FileInfo
类的实例。
我理解这一点,可以盲目地简单使用它,但我想知道为什么会有差异?
它们的工作方式有什么不同之处,使它们适用于不同的情况? 为什么需要这两个看起来以不同方式执行相同操作的不同类?
如果有人能回答其中任何一个问题,那将非常有帮助。
通常情况下,如果您只对文件执行单个操作,请使用 File
类。如果您要对同一文件执行多个操作,请使用FileInfo
。
这样做的原因是因为在访问文件时进行了安全检查。当您创建 FileInfo
实例时,检查只会执行一次。但是,每次使用静态File
方法时都会执行检查。
File
和FileInfo
类的方法类似,但它们的区别在于File类的方法是static
的,因此需要传递比你为FileInfo
实例的方法更多的参数。你需要这样做是因为它操作一个特定的文件;例如,
FileInfo.CopyTo()
方法需要一个参数用于指定要复制的文件的目标路径,而File.Copy()
方法需要两个参数,分别是源路径和目标路径。
参考资料
File
和FileInfo
。 - Jake BergerFile.Exists
方法的执行速度比 new FileInfo(filePath).Exists
快得多,尤其是在网络上并且文件确实存在的情况下。这是因为 File.Exists
只会检查文件是否存在,而 new FileInfo(filePath).Exists
首先会构造一个包含文件所有属性(日期、大小等)的 FileInfo
对象(如果该文件存在)。File.Exists
的速度明显更快(例如 20ms 对比 200ms)。FileInfo是文件的实例,代表着文件本身。File是一个实用类,因此可以与任何文件一起使用。
File类型适用于对单个文件进行一次性操作,FileInfo类型则适用于对同一文件进行多次操作,但是总体而言,不同方法实现之间的差异并不大。
如果您想比较确切的实现,请使用Reflector查看这两个类。
可能需要使用FileInfo处理访问控制属性。对于其余部分,这是静态与实例的选择,您可以选择方便的内容。
是的,其中一个原因可能是,正如Nag所说,Files是一个实用类,因此不需要创建任何实例。同时,由于File是实用类,每次都需要进行安全检查。
另一方面,FileInfo需要创建实例,并且在该点上使用安全检查。因此,现在使用FileInfo执行多个操作将不会调用安全检查。
最近我遇到了与File.Exist
有关的问题,我讨厌这个函数。之后我使用了Fileinfo
类的Exist
函数,然后我的程序就正常工作了。
实际上,在开发环境中,File.Exist
函数工作得很好,但是当它进入生产环境时,由于该函数阻塞了文件对象,所以我会收到访问被拒绝的错误并且无法使用该文件。
这是我的经验教训。
我永远不会再使用File.Exist
方法,最好的方法是创建对象然后使用它。请注意使用静态方法。
File
类和FileInfo
类的主要区别在于:
File
类和FileInfo
类的成员都带有[System.Security.SecurityCritical]和[System.Security.SecuritySafeCritical]
属性修饰符,但是与FileInfo
类相比,File
类具有“多个安全检查”(点此了解),而且每次调用File
类的静态成员时都会执行这些检查。当你创建
FileInfo
实例时,仅执行一次检查。
File
是一个静态类型类,而FileInfo
是一个实例类型类。FileInfo
类的成员,您需要创建一个实例,而在File
类中,您可以直接访问其成员,无需创建实例。FileInfo
实例方法比使用File
类的相应静态方法更有效率。File
类提供的方法比FileInfo
类更多。注意:代码执行安全关键操作时,必须将SecurityCriticalAttribute属性或SecuritySafeCriticalAttribute属性应用于代码。