В чем именно разница между My.Computer.FileSystem и System.IO.File - PullRequest
8 голосов
/ 03 мая 2011

В пространствах имен My.Computer.FileSystem и System.IO.File много дублирования функций.

Так в чем же разница:

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

и

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

Есть ли разница в производительности? Каково мнение каждого, у кого есть преимущество в чтении? Я лично использую пространство имен My.Computer, но сейчас это просто привычка.

Ответы [ 5 ]

9 голосов
/ 03 мая 2011

My. * - это просто набор классов шаблонов фасадов, реализованных для VB.NET, которые охватывают обычные операции System.IO * (и другие). очень незначительное снижение производительности, так как вы проходите дополнительный уровень абстракции, но вам нужно решить, стоит ли оптимизировать его для этого.Я бы предложил использовать любой способ, который имеет смысл для вас и других в вашем магазине.

Если вы изучите код для My.Computer.FileSystem.CopyFile с помощью .NET Reflector, вы увидите, что метод оборачивает многие классы 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
2 голосов
/ 30 июня 2016

Что касается метода

System.IO.Directory.Delete

и

FileSystem.DeleteDirectory 

, существует довольно важное различие.

При использовании

System.IO.Directory.Delete

a System.IO.IOException будет выброшено, если каталог не пустой.Однако при использовании

FileSystem.DeleteDirectory

действие по умолчанию заключается в том, чтобы продолжить и удалить файл, если только вы не добавите дополнительный параметр

Это с этой страницы

Public Shared Sub DeleteDirectory (каталог As String, onDirectoryNotEmpty As DeleteDirectoryOption)

Каталог параметров

Тип: System.String Каталог, который необходимо удалить.onDirectoryNotEmpty

Тип: Microsoft.VisualBasic.FileIO.DeleteDirectoryOption Указывает, что следует делать, если каталог, который необходимо удалить, содержит файлы или каталоги.По умолчанию это DeleteDirectoryOption.DeleteAllContents.

Другой вариант - указать DeleteDirectoryOption.ThrowIfDirectoryNonEmpty

Есть и другие отличия, но этот, на мой взгляд, выделяется на милю.

2 голосов
/ 03 мая 2011

Практически ничего.

My.Computer был добавлен в VB как более удобный и понятный уровень абстракции для базовых функций.Некоторые из его методов добавляют новую функциональность, которая, по моему мнению, будет единственным случаем, когда вы будете использовать его для System.IO.File.

Примером, где My.Computer добавит функциональность через System.IO.File, является Сеть.DownloadFile метод, в котором он имеет возможность показывать пользователю диалог:

Если для showUI задано значение True, появляется диалоговое окно, в котором отображается ход операции;диалоговое окно содержит кнопку «Отмена», которую можно использовать для отмены операции.Диалоговое окно не является модальным и, следовательно, не блокирует пользовательский ввод в другие окна программы.

Если вы уже использовали System.IO.File в местах, я настоятельно рекомендую не использовать My.Computer по соображениям согласованности.А именно, не смешивайте вызовы методов в My.Computer и System.IO.File, придерживайтесь одного пространства имен!

1 голос
/ 03 мая 2011

Пространство имен My представляет собой конструкцию VB.Net, которая отчасти предназначена для того, чтобы быть мостом между API-интерфейсами VB6 и .Net.Эти методы имеют тенденцию иметь семантику VB6 + внешний вид.

Если вы пользователь VB6, переходящий на .Net, я бы использовал эти методы, поскольку они будут ближе к ожидаемому вами поведению.В противном случае я бы придерживался стандартных API .Net 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
0 голосов
/ 28 августа 2018

Вот разница, вызванная сбоем приложения:

My.Computer.FileSystem.WriteAllText вставляет 3-байтовую спецификацию (EF BB BF) в начало файла, а system.io.file - нет.

Таким образом, я заменил My.Computer.FileSystem.WriteAllText на system.io.file.WriteAllText и это исправило.

...