Хорошие причины для передачи путей как строк вместо использования DirectoryInfo/FileInfo

В моем новом коде я не использую строки для передачи путей к каталогам или имен файлов. Вместо этого я использую DirectoryInfo и FileInfo, поскольку они, похоже, инкапсулируют много информации.

Я видел много кода, который использует строки для передачи информации каталога, а затем "split" и "mid" и "instr" в длинных непонятных операторах, пока они не получат часть каталога, который они ищут.

Есть ли веская причина, чтобы передавать пути как строки?

Ответы

Ответ 1

В общем, я считаю, что лучше хранить информацию в FileInfo/DirectoryInfo. В этих классах есть много полезной функциональности, а также большая безопасность, так что гораздо проще проверить наличие файла, посмотреть его исходный файл и т.д.

Единственное место, где я мог бы (потенциально) передать путь как строку, а не использовать FileInfo и DirectoryInfo, будет ли путь проходить через AppDomains или между процессами и т.д.

FileInfo и DirectoryInfo работают отлично в границах AppDomain (поскольку они являются Serializable), но в этой ситуации у них есть еще много накладных расходов. Если что-то идет вперед и назад, это может повлиять.

В этом случае я бы придерживался FileInfo и DirectoryInfo, если не обнаружил, что во время моего профилирования была заметная проблема, и я пытался уменьшить количество сериализованных данных. Если бы я не столкнулся с проблемами производительности, я бы придерживался этих классов, поскольку они обеспечивают большую безопасность и функциональность.

Ответ 2

DirectoryInfo и FileInfo ужасно тяжелы для прохождения, если все, что вам нужно, это путь. Меня больше волнует "раскол и середина" и "instr". Изучите способы:

Path.GetFileName
Path.GetDirectoryName
Path.Combine
и т.д.

Это из класса System.IO.Path, btw.

Ответ 3

Как только путь находится в приложении (т.е. не в файле конфигурации простого текста), нет, нет веской причины.

Единственное время (я могу придумать), что это может быть полезно, - это взаимодействовать с кодом, который принимает только пути как строки.

Ответ 4

У меня возникли проблемы при передаче FileInfo в DMZ. Насколько я могу судить - исправьте меня, если я ошибаюсь - FileInfo выполняет проверку разрешений при десериализации, и это не будет работать из DMZ и приведет к "пути не найден". Создайте и передайте пользовательский объект с данными, которые вы используете.

Ответ 5

Я думаю, что вам нужен класс для инкапсуляции пути к файлу или каталогу, вместо того, чтобы использовать необработанные строки и манипулировать ими, используя статический класс System.IO.Path. Тем не менее, Я не считаю DirectoryInfo и FileInfo подходящими, потому что они, похоже, больше предназначены для выполнения манипуляций с файлами и каталогами вместо операций с путями. Если вы создаете пользовательский класс для манипуляций с пути, вы можете обеспечить более удобные для пользователя функции управления трафиком.