Во-первых, давайте разберем, что делает ваш код:
file
в \\abc.def.txt
true
Если объект file
не null
и file.exists()
возвращает true
file1
в \\abc.def.txt
true
Если file1
объект не null
и file.exists()
возвращает true
В ответ на ваш вопрос редактирования, в Windows, начиная с \
, предполагается, что Вы идете в каталог «корневого» уровня. В вашем примере это должно быть C:
, если не указано иное.
Вы создаете оба файла, и ваша проверка True / False действительно проверяет, существуют ли они, а не , где они существуют. Если вы хотите проверить, где они существуют, вы можете сделать что-то вроде этого:
File file = new File("\\abc.def.txt");
boolean check = new File(directory, file).exists();
System.out.println(check); // Returns true
File file1 = new File("C:\\abc.def.txt");
boolean check1 = new File("C:\\", "abc.def.txt").exists();
System.out.println(check1); //Returns true
Я посмотрел на подход Мартена Баллиау в ответ на комментарий Ликвида, но, похоже, излишне то, что я пытаюсь делать.
Я взломал временное решение. Я просто передаю имена контроллеров и действий для генерации URL. Чтобы сгенерировать URL-адреса, я использую следующий код:
List<string> urlList = new List<string>();
urlList.Add(GetUrl(new { controller = "Help", action = "Edit" }));
urlList.Add(GetUrl(new { controller = "Help", action = "Create" }));
urlList.Add(GetUrl(new { controller = "About", action = "Company" }));
urlList.Add(GetUrl(new { controller = "About", action = "Management" }));
, где GetUrl, как показано ниже:
protected string GetUrl(object routeValues)
{
RouteValueDictionary values = new RouteValueDictionary(routeValues);
RequestContext context = new RequestContext(HttpContext, RouteData);
string url = RouteTable.Routes.GetVirtualPath(context, values).VirtualPath;
return new Uri(Request.Url, url).AbsoluteUri;
}
Пока что это помогает, хотя мне нравится идея применения actionfilter к определенным действиям, которые собраться автоматически.
Как likwid упоминания, Вы хотите размышлять над своим пространством имен модели (моделей) и получить все классы та реализация IController. После того как у Вас есть набор, Вы хотите отразиться для наблюдения, какие участники (методы) возвращают тип ActionResult.
Возможно, можно создать собственный атрибут, [SitemapAttribute], который позволяет Вам выборочно указать что методы индексировать в карте сайта (т.е. Индекс (), но не Редактирование ()). Да, мне нравится эта идея управлять, какие методы (URL) записан.
Это - превосходный вопрос, потому что я просто думал о выполнении того же. +1!
// Controller abstract implements IController
public class HelpController : Controller
{
public HelpController()
{
}
[Sitemap]
public ActionResult Index()
{
// does get written to the file, cause of [Sitemap]
}
public ActionResult Create()
{
// does not get mapped to the file
}
public ActionResult Edit()
{
// does not get mapped to the file
}
[Sitemap]
public ActionResult ViewArticle()
{
// would get indexed.
}
}
Поскольку, как сделать отражение, вот хорошая статья MSDN для представления Вас отражению:
http://msdn.microsoft.com/en-us/library/ms172331.aspx
Хороший вопрос!
Итак, получение контроллеров и действий кажется мне относительно тривиальной частью. Сложной является возможность получить все возможные значения параметров, которые вы, возможно, захотите показать в URL-адресах вашей карты сайта. Если у вас есть шаблон URL, например, {controller} / {action} / {id}
, то вы не сможете с помощью размышлений определить, что означает значение id
. или возможные значения. Лучшее, что вы можете сделать, это определить тип системы.
Что мне пришло в голову, когда я смотрел на это, так это то, что карта сайта - это просто еще одно представление данных вашего сайта. Поэтому одна случайная мысль, которая у меня возникла, заключалась в том, что если вы наследуете от базового контроллера в своем приложении, и у вас есть метод на этом базовом контроллере, который должен быть реализован, например:
abstract ActionResult SiteMapSnippet();
Затем вы можете создать SiteMapController
, который вызывает каждый из других контроллеров в решении и запрашивает их фрагмент, а затем отображает их все вместе в одном конечном виде. Вроде составного контроллера, хотя это еще не концепция, которая была добавлена в эту платформу.
Имейте Вас, попробовал что-то вроде этого:
После перечитывания Вашего вопроса я вижу, что Вы хотите что-то немного различное, чем пример, который я обеспечил. Я думаю, что необходимо было бы отразить все известные контроллеры и их действия для создания карты сайта динамично.
Было бы намного более просто использовать базу данных или файл карты сайта как Ваш источник, я думаю.
Смотрите на код позади "Отладчика Маршрута Phil Haack":
http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
Ниже я разместил ответ «сделай сам»
. Но вот пакет, который делает это из коробки для сайтов MVC:
http://mvcsitemap.codeplex.com/ (<- старый сайт, но с обширной документацией!)
https: / /github.com/maartenba/MvcSiteMapProvider/wiki (<- перемещен на новый сайт, отсутствует документация и не так активен)
Обратите внимание, что он выполняет множество действий:
Все вышеперечисленные пункты управляются из единого XML-файла mvc.sitemap, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.
Хотя я считаю, что возможность создавать поставщиков динамических данных немного обременительна (и серьезно нарушает любой тип IoC, который вы хотите использовать), он действительно дает работа сделана и хорошо масштабируется, если вы обойдете их кеширование и воспользуетесь своим.
Все вышеперечисленные пункты управляются с одного mvc. XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется - это действительно здорово.
Хотя я считаю, что возможность создавать поставщиков динамических данных немного обременительна (и серьезно нарушает любой тип IoC, который вы хотите использовать), он действительно дает работа выполнена и хорошо масштабируется, если вы обойдете их кеширование и воспользуетесь собственным.
Все вышеперечисленные пункты управляются с одного mvc. XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется - это действительно здорово.
Хотя я считаю, что возможность создавать поставщиков динамических данных немного обременительна (и серьезно нарушает любой тип IoC, который вы хотите использовать), он действительно дает работа выполнена и хорошо масштабируется, если вы обойдете их кеширование и воспользуетесь собственным.
XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.Хотя я считаю, что возможность создавать поставщиков динамических данных немного обременительна (и серьезно нарушает любой тип IoC, который вы хотите использовать), он действительно дает работа сделана и хорошо масштабируется, если вы обойдете их кеширование и воспользуетесь своим.
XML-файл карты сайта, который вы редактируете и настраиваете. Я использовал это в ряде проектов, чтобы выполнить 2 или 3 из перечисленных выше пунктов. Все это настраивается в одном месте и динамически генерируется, это действительно здорово.Хотя я считаю, что возможность создавать поставщиков динамических данных немного обременительна (и серьезно нарушает любой тип IoC, который вы хотите использовать), он действительно дает работа сделана и хорошо масштабируется, если вы обойдете их кеширование и воспользуетесь своим.
Определите ActionFilterAttribute
, подобный этому, чтобы поместить его на любой метод Action, который является фактической страницей, которую вы хотите перечислить в вашей карте сайта:-
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MVCUrlAttribute : ActionFilterAttribute
{
public string Url { get; private set; }
public MVCUrlAttribute(string url)
{
this.Url = url;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
// Put this 'canonical url' into the model (which feeds the view)
// to help search engines with issues of duplicate content
filterContext.Controller.ViewData["CanonicalUrl"] = url;
base.OnResultExecuting(filterContext);
}
}
Теперь добавьте что-то подобное в код запуска вашего глобального приложения или используйте его в коде генерации sitemap.xml:-
// Find all the MVC Routes
Log.Debug("*** FINDING ALL MVC ROUTES MARKED FOR INCLUSION IN SITEMAP");
var allControllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(Controller)));
Log.DebugFormat("Found {0} controllers", allControllers.Count());
foreach (var controllerType in allControllers)
{
var allPublicMethodsOnController = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
Log.DebugFormat("Found {0} public methods on {1}", allPublicMethodsOnController.Count(), controllerType.Name);
foreach (var publicMethod in allPublicMethodsOnController)
{
var mvcurlattr = publicMethod.GetCustomAttributes(true).OfType<MVCUrlAttribute>().FirstOrDefault();
if (mvcurlattr != null)
{
string url = mvcurlattr.Url;
Log.Debug("Found " + controllerType.Name + "." + publicMethod.Name + " <-- " + url);
Global.SiteMapUrls.Add(url); //<-- your code here using url
}
}
}
Вы можете расширить класс атрибута, чтобы, возможно, также включить подсказку частоты обновления.