My.Computer.FileSystem
和System.IO.File
命名空间中存在大量重复功能。
那究竟是什么区别:
My.Computer.FileSystem.CopyFile(source, dest, True)
和
System.IO.File.Copy(source, dest, True)
是否存在性能差异?每个人对于阅读能力有哪些优势的看法是什么?我个人使用My.Computer
命名空间,但这只是习惯。
答案 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.Computer
和System.IO.File
中的方法,坚持使用一个命名空间!
答案 2 :(得分:2)
关于
System.IO.Directory.Delete
和
FileSystem.DeleteDirectory
方法,有一个很重要的区别。
使用
System.IO.Directory.Delete
如果目录不为空,将抛出'System.IO.IOException'。但是,用
FileSystem.DeleteDirectory
默认操作是继续并删除文件,除非您包含addidional参数
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
修改强>
有些人质疑我是否误认为My
命名空间的Microsoft.VisualBasic
命名空间。我不是。 My
命名空间很多东西,但一个项目将某些调用包装到转发到Microsoft.VisualBasic
的方法中。例如,如果您在VB.net项目中键入以下代码
My.Computer.FileSystem.CopyFile(source, dest)
它将导致以下一组事件
MyProject.Computer.FileSystem.CopyFile
的调用将嵌入应用程序MyProject
和MyComputer
将生成到程序集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,并进行了修复。