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】:
File
和FileInfo
类的方法相似,但它们的不同之处在于 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:大多数静态类/方法需要知道要作用于哪个对象;而大多数实例方法自然地作用于指定的实例。这不仅限于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】:文件信息:
使用前需要实例化 包含实例方法 缓存文件信息,每次都需要调用刷新来获取文件的最新信息文件:
无需实例化 包含静态方法 不缓存,因此每次使用时都会获得最新信息。源代码:
FileInfo File【讨论】:
【参考方案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.
【讨论】:
以上是关于C# 中的 File 和 FileInfo 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章