File.Delete() 和 FileInfo.Delete() 的区别

17

使用File对象的静态方法和创建一个新的FileInfo对象并调用那些方法之间有很大的区别吗?


2
一个是静态的,另一个需要实例化,清晰明了! :) - leppie
7个回答

16
唯一的区别在于,File必须解析指定的路径(假设它是相对路径),而FileInfo应该已经有了解析后的路径。

你的意思是,如果给定的路径是相对路径,则必须在调用Win32 Delete方法之前立即完成工作。而对于FileInfo,路径在创建时已经被解析为绝对路径。这是你所说的正确解释吗?换句话说,这是CLR在幕后执行的工作,如果使用相同的相对路径频繁调用File.Delete(),可能会影响性能。 - Tim Coker
@TimCoker - 这是正确的。如果您已经有了FileInfo,则可以节省一次调用Path.GetFullPathInternal,该方法会执行一些工作以规范化/解析路径。正如@errorstacks所指出的那样,一个是静态方法,一个是实例方法。因此,您无法在没有FileInfo实例的情况下调用FileInfo.Delete。假设您已经拥有了它,那么唯一的区别就是路径解析。 - CodeNaked

7

两者均调用Win32Native.DeleteFile()


3

这要看情况。如果您只需要执行一次操作,可以使用File类;如果进行同一文件的多次操作,则应使用FileInfo

编辑: 我的理解是,File类的静态方法会始终检查安全性。但是,如果您重复使用FileInfo实例,则方法仅在第一次调用时执行安全检查,而不是每次调用都检查。


3
当进行负面评价时,了解评价原因会让人感到耳目一新。这是一个问答网站,也是一个学习资源。如果回答完全不正确,请提供一些信息。 - Jesse
我很好奇为什么你也被踩了。你提出了一个有趣的观点。 - Tim Coker
1
我没有给你的建议点踩,但我可能会这么做。你提供的推荐理由非常含糊。如果你觉得它是正确的,请用参考资料来支持它。 - Michael Petrotta
也许是因为它与您最初的问题有点不同?在调用delete时没有区别...我只想指出,在执行多个操作时,最好使用FileInfo... - Jesse
2
@Jesse - 抱歉,我确实点了踩,但是被拉走了。你关于安全性的说法是不正确的,你可以使用Reflector进行验证。两种删除方法对文件都需要完全相同的权限。 - CodeNaked

1

希望这些能对你有所帮助...

IO.FileInfo 提供了用于创建、复制、删除、移动和打开文件的实例方法,并助于创建 System.IO.FileStream objects。此类不能被继承。

这意味着,你需要创建 FileInfo 的实例/对象来完成这些过程。

IO.File 提供了用于创建、复制、删除、移动和打开文件的静态方法,并助于创建 System.IO.FileStream 对象。

这意味着,你不需要创建 FileInfo 的实例/对象来完成这些过程。

查看以下链接以获取更多信息。

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

http://msdn.microsoft.com/en-us/library/system.io.file.aspx


1

不,它们基本上是一样的东西。


0

不,它们是为了方便而复制的。


-1

几乎没有区别。两者都会删除文件(如果存在)并在文件不存在时抛出异常。


1
这并不是真的(至少不再是真的)。如果文件不存在,FileInfo.Delete 不会执行任何操作,请参阅 http://msdn.microsoft.com/en-us/library/system.io.fileinfo.delete(v=vs.110).aspx。 - Robba

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