My.Computer.FileSystem和System.IO.File之间究竟有什么区别

时间:2011-05-03 14:39:43

标签: .net vb.net visual-studio namespaces coding-style

My.Computer.FileSystemSystem.IO.File命名空间中存在大量重复功能。

那究竟是什么区别:

My.Computer.FileSystem.CopyFile(source, dest, True)

System.IO.File.Copy(source, dest, True)

是否存在性能差异?每个人对于阅读能力有哪些优势的看法是什么?我个人使用My.Computer命名空间,但这只是习惯。

5 个答案:

答案 0 :(得分:9)

My。*只是为VB.NET实现的一组Facade模式类,包含常见的System.IO *(和其他)操作。由于您需要经过额外的抽象层,因此非常微小的性能损失,但您必须决定是否值得优化。我建议使用对你和你店里的其他人有意义的方式。

如果使用.NET Reflector检查My.Computer.FileSystem.CopyFile的代码,您将看到该方法包装了许多System.IO类,例如File和Directory,尤其是File类的Copy,Move和Delete方法。片段:

'lots of other code snipped out for brevity and to show the use of System.IO classes...

Directory.CreateDirectory(FileSystem.GetParentPath(str))

   'snip

    If 
       ' snip
    Else
        File.Delete(str)
        File.Move(path, str)
    End If
Else
    File.Move(path, str)
End If
End Sub

答案 1 :(得分:2)

几乎没有。

My.Computer被添加到VB作为底层函数的更方便和可理解的抽象层。它的一些方法添加了新的功能,在我看来,这是你唯一一次在System.IO.File上使用它。

My.Computer将在System.IO.File上添加功能的示例是Network.DownloadFile方法,其中它可以向用户显示对话框:

  

如果showUI设置为True,则为对话框   看来显示了进展情况   操作;该对话框包含一个   可以使用的取消按钮   取消操作。对话框   不是模态的,因此不是   阻止用户输入其他窗口   该计划。

如果你已经在地方使用了System.IO.File,我强烈建议不要使用My.Computer来保持一致性。也就是说,不要混淆调用My.ComputerSystem.IO.File中的方法,坚持使用一个命名空间!

答案 2 :(得分:2)

关于

System.IO.Directory.Delete

FileSystem.DeleteDirectory 

方法,有一个很重要的区别。

使用

System.IO.Directory.Delete

如果目录不为空,将抛出'System.IO.IOException'。但是,用

FileSystem.DeleteDirectory

默认操作是继续并删除文件,除非您包含addidional参数

这是this page

  

Public Shared Sub DeleteDirectory(目录为String,onDirectoryNotEmpty为DeleteDirectoryOption   )

     

参数目录

     

类型:System.String要删除的目录。   onDirectoryNotEmpty

     

类型:   Microsoft.VisualBasic.FileIO.DeleteDirectoryOption   指定当要删除的目录包含文件或目录时应执行的操作。默认为DeleteDirectoryOption.DeleteAllContents。

另一个选项是指定DeleteDirectoryOption.ThrowIfDirectoryNonEmpty

还有其他差异,但这一点,对我来说是一步之遥。

答案 3 :(得分:1)

My命名空间是VB.Net构造,其部分目的是成为VB6和.Net API之间的桥梁。这些方法往往具有VB6语义+外观。

如果您是转换为.Net的VB6用户,我会使用这些方法,因为它们将更接近您期望的行为。否则我会坚持使用System.IO.File.Copy

的标准.Net API

修改

有些人质疑我是否误认为My命名空间的Microsoft.VisualBasic命名空间。我不是。 My命名空间很多东西,但一个项目将某些调用包装到转发到Microsoft.VisualBasic的方法中。例如,如果您在VB.net项目中键入以下代码

My.Computer.FileSystem.CopyFile(source, dest)

它将导致以下一组事件

  • MyProject.Computer.FileSystem.CopyFile的调用将嵌入应用程序
  • 类型MyProjectMyComputer将生成到程序集
  • MyComputer类型只是源自Microsoft.VisualBasic.Devices.Computer
  • 因此,FileSystem.CopyFile方法会解析为FileSystemProxy.CopyFile,只会转发到FileSystem.CopyFile

答案 4 :(得分:0)

这是由应用程序故障引起的差异:

My.Computer.FileSystem.WriteAllText在文件的开头插入一个3字节的BOM(EF BB BF),而system.io.file则没有。

因此,我将My.Computer.FileSystem.WriteAllText替换为system.io.file.WriteAllText,并进行了修复。