C# 中的 File 和 FileInfo 有啥区别?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

FileInfo.Exists 已缓存阅读此***.com/questions/22042353/… 【参考方案1】:

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

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

【讨论】:

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

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

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

参考文献

http://aspfree.com/c/a/C-Sharp/A-Look-at-C-Sharp-File-and-FileInfo-Classes/1/ http://intelliott.com/blog/PermaLink,guid,ce9edbdb-6484-47cd-a5d6-63335adae02b.aspx

【讨论】:

-1:大多数静态类/方法需要知道要作用于哪个对象;而大多数实例方法自然地作用于指定的实例。这不仅限于FileFileInfo【参考方案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】:

文件信息:

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

文件:

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

源代码:

FileInfo File

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

说绝对是最好的建议!【参考方案10】:

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

FileFileInfo 类的两个成员都使用 [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.

【讨论】:

以上是关于C# 中的 File 和 FileInfo 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C#读写二进制文件

FileInfo类和DirectoryInfo类

C# File类:文件操作

C#中File类的文件操作方法详解

C#常用IO流及读写文件

c#中有啥类似的fread命令