My.Computer.FileSystem和System.IO.File之间的确切区别是什么?

9

My.Computer.FileSystemSystem.IO.File命名空间中有很多功能重复。

那么它们之间到底有什么不同呢?

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

并且:

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

有性能差异吗?大家对哪个更易读的意见是什么?我个人使用My.Computer命名空间,但现在只是习惯而已。
6个回答

11

我的"*"只是一个针对VB.NET实现的外观模式类集,包含常见的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

谢谢你的回答。我只是一个人在我的工作室里,所以我可以决定自己喜欢什么,但我对人们的偏好有点感兴趣。 - Matt Wilko
1
JIT编译使得即使是“微小的性能损失”也更不太可能被注意到。出于一致性的原因,我并不经常使用My类,但如果您发现它方便,那么绝对没有任何问题。这就是整个目的,在常见情况下加快开发速度。 - Cody Gray
@Cody:完全同意。根据您的反馈,我编辑并添加了修饰语“非常”来描述微小。 - Paul Sasik

2
几乎没有什么区别。 My.Computer 是在 VB 中添加的更方便和易于理解的抽象层,用于底层功能。 它的一些方法添加了新功能,这只有在需要使用 System.IO.File 时才会使用它。
一个例子是 My.ComputerNetwork.DownloadFile 方法,其中它具有向用户显示对话框的功能:

如果将 showUI 设置为 True,则会出现对话框, 显示操作的进度;对话框包含一个 取消按钮,可用于取消操作。 对话框 不是模态的,因此不会阻止程序中其他窗口的用户输入。

如果您已经在某些地方使用过 System.IO.File,出于一致性原因,强烈建议不要在其上使用 My.Computer。也就是说,不要混合调用 My.ComputerSystem.IO.File 中的方法,应该坚持使用一个命名空间!

6
My.Computer是为初学者添加到VB中的” - 这是无稽之谈。这从未是它的规定用途。相反,它是一个“便利层”,没有什么不好使用它。但有些功能确实完全重复了,这有点不太幸运。 - Konrad Rudolph
它抽象出用户函数的事实使其成为初学者使用的关键项目。它不仅仅是一个方便层,而是为某些方法提供了比System.IO.*更多的功能。我从未打算让我的有关初学者的声明成为一个如此直接的陈述。 - Rudi Visser
请查看我的编辑后的答案,希望能更好地传达观点。 - Rudi Visser
1
除了 My.Computer.FileSystem.WriteAllText 在文件开头插入 3 字节的 BOM 之外,system.io.file 几乎没有任何东西。 - Doug Null

2
关于……
System.IO.Directory.Delete

并且

FileSystem.DeleteDirectory 

“方法”和“方式”,有一个相当重要的区别。
使用
System.IO.Directory.Delete

如果目录不为空,则会引发'System.IO.IOException'。但是,使用
FileSystem.DeleteDirectory

默认操作是继续并删除文件,除非您包含一个附加参数。
这来自于此页面
公共共享子程序DeleteDirectory(directory As String,onDirectoryNotEmpty As DeleteDirectoryOption)
参数directory
类型:System.String 要删除的目录。 onDirectoryNotEmpty
类型: Microsoft.VisualBasic.FileIO.DeleteDirectoryOption 指定要删除的目录包含文件或目录时应执行的操作。默认值为DeleteDirectoryOption.DeleteAllContents。
另一个选项是指定DeleteDirectoryOption.ThrowIfDirectoryNonEmpty。
还有其他差异,但对我来说,这一点很明显。

1

My.Computer.FileSystem.CopyFile("source", "destination")

It will actually call the Microsoft.VisualBasic.FileIO.FileSystem.CopyFile method. So while it's true that the My namespace is not exclusively a VB6 compatibility layer, it does contain methods that are intended to make the transition from VB6 to .Net easier.

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

这将导致以下一系列事件

  • 调用MyProject.Computer.FileSystem.CopyFile将被嵌入应用程序中
  • 类型MyProjectMyComputer将生成到程序集中
  • MyComputer类型仅从Microsoft.VisualBasic.Devices.Computer派生
  • 因此,FileSystem.CopyFile方法解析为FileSystemProxy.CopyFile,它只是转发到FileSystem.CopyFile

1
“成为VB6和.Net API之间的桥梁” - 真的吗?我认为你把这个与Microsoft.VisualBasic命名空间混淆了。有两件事情反驳了你的理论:①该命名空间是在VB.NET的较晚版本中添加的,②它并没有特别接近复制VB6的功能(除了My.Forms)。 - Konrad Rudolph
1
@Konrad 我相当确定我是正确的。在底层,My.Computer.FileSystem 调用会生成到目标程序集中,并且它们会转发到 Microsoft.VisualBasic。你可以使用反编译工具验证这一点。 - JaredPar
1
@Jared 即使是字符串比较("a" = "b")也会生成依赖于 Microsoft.VisualBasic 的代码,这并不是一个论据。 - Konrad Rudolph
@Konrad,请查看我的编辑后的答案。使用 My.Computer.FileSystem 实际上是转发到 Microsoft.VisualBasic.FileSystem,这部分旨在为 VB6 用户提供兼容性层。 - JaredPar
@Konrad 是的,My.Computer.FileSystem 最终会转发到 M.VB.FileIO.FileSystem。我原本以为这两种类型都是兼容性层的一部分。尤其是 FileIO.FileSystem 方法。 - JaredPar
显示剩余2条评论

0
这里有一个导致我的应用程序出现故障的差异:
My.Computer.FileSystem.WriteAllText 在文件开头插入了一个3字节的BOM(EF BB BF),而system.io.file则没有。
因此,我用 system.io.file.WriteAllText 替换了 My.Computer.FileSystem.WriteAllText,问题得到了解决。

0

使用 System.IO.File.Delete 与 My.Computer.FileSystem.DeleteFile 相比确实有所不同:

如果 a_file 不存在,My.Computer.FileSystem.DeleteFile(a_file) 会抛出 FileNotFoundException 异常,而 System.IO.File.Delete(a_file) 不会。

只有当 a_file 中包含的路径不存在时,System.IO.File.Delete 才会抛出 DirectoryNotFoundException 异常。


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