Создание виртуальных каталогов в подкаталогах в IIS 6.0 (программно) - PullRequest
0 голосов
/ 05 февраля 2011

Я пытаюсь создать виртуальные каталоги в IIS 6.0 программным способом и у меня возникают проблемы с проверкой, существует ли виртуальный каталог, если виртуальный каталог находится во вложенной папке.

Так что, если у меня есть дерево папок, такое как:

MySite
  Folder A (virtual directory)
  Folder B
      NestedFolder C (virtual directory)

Когда я беру объект DirectoryEntry для этой метабазы ​​сайта:

"IIS://<servername>/W3SVC/2/Root"

Объект DirectoryEntry (назовем его entry) будет иметь двух детей, с

entry.Children[0].Name = "Folder A"

но entry.Children [1] .Name = "Папка B", которая не является виртуальным каталогом. Я должен сделать следующее (код), чтобы добраться до любых виртуальных каталогов во вложенных папках:

foreach (var directoryEntry in entry.Children.Cast<DirectoryEntry>().Where(directoryEntry => directoryEntry.SchemaClassName == "IIsWebVirtualDir" || directoryEntry.SchemaClassName == "IIsWebDirectory")) {
            foreach (DirectoryEntry child in directoryEntry.Children.Cast<DirectoryEntry>().Where(subChild => subChild.SchemaClassName == "IIsWebVirtualDir")) {
                if (child.Name == vDir)
                    return true;
            }

            if (directoryEntry.Name != vDir) continue;
            return true;
        }

Что для меня довольно безобразно. Есть ли лучший способ проверить наличие виртуальных каталогов, если они существуют в подпапках?

1 Ответ

1 голос
/ 05 февраля 2011

Вы ищете рекурсивную функцию для итерации всего сайта?

public static void Main() {
    var siteRoot = new DirectoryEntry("IIS://<servername>/W3SVC/2/Root");
    var containsVirtualDirectory = ContainsVirtualDirectory(siteRoot);
}

private static Boolean ContainsVirtualDirectory(DirectoryEntry container) {
    foreach (DirectoryEntry child in container.Children) {
        if (child.SchemaClassName == "IIsWebVirtualDir")
            return true;

        if (child.SchemaClassName == "IIsWebDirectory" && ContainsVirtualDirectory(child))
            return true;
    }

    return false;
}
...