Directory.GetFiles работает, Directory.GetDirectories не в том же каталоге
У меня есть простой селектор файлов в моем веб-приложении, которое использует Directory.GetFiles и Directory.GetDirectories для создания пользовательского интерфейса. Это прекрасно работает на моем локальном хосте, но когда я загружаю его на свой хостинг Windows Server 2003, я вижу только файлы - в том же каталоге, GetFiles работает, но GetDirectories нет.
Код невероятно прост - строка dir создается с помощью вызова Server.MapPath, а затем:
List<string> dirs = Directory.GetDirectories(dir).ToList();
List<string> files = Directory.GetFiles(dir).ToList();
Я перепробовал все, что мог думать о безопасности; даже вплоть до предоставления "Все" полного доступа ко всем каталогам в корне сети, и даже это не имеет значения.
Так что, если проблема не в безопасности, я был бы очень признателен за некоторые предложения, чтобы попробовать больше вещей!
Обновление: я довольно тупой - код, который выплевывал HTML, содержал некоторый очень старый тестовый код, который не имел никакого значения для локального, поэтому не был замечен и удален, но это привело к игнорированию каждого каталога на сервере.! Что это было?
if (!subDir.Contains(".")) { ...
На сервере все сайты находятся в папках, названных их доменом - на локальном, они не. Я == глупый Извините всех!
3 ответа
Каталоги скрыты?
Это действительные каталоги или (поскольку это веб-сервер) виртуальные папки?
Кстати, если вы не хотите, чтобы некоторые из List<T>
функции, вы могли бы также оставить их в оригинале string[]
массивы... действительно, с 3.5, LINQ размывает преимущества List<T>
, поскольку Where(...)
, First(...)
и т.д. применяются к массивам.
Вы проверили, что каталог находится там, где вы думаете? IIS часто может поместить вас во временную директорию, поэтому он мог скопировать все ваши файлы в эту временную папку, но не в подкаталоги, поэтому их просто нет.
Вы можете вызвать исключение, если у вас нет разрешения:
new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read,dir).Demand();