Получить все пути к файлам в папке Content в ASP.NET MVC - PullRequest
2 голосов
/ 29 февраля 2012

Мне нужно перечислить все относительные пути к файлам в папке «Содержимое».

Я написал кое-что, что работает, но кажется немного ломким.Есть ли лучший / умный способ сделать это?

var contentPaths = GetRelativePathsToRoot("~/Content/").ToList();

private IEnumerable<string> GetRelativePathsToRoot(string virtualPath)
    {
        var physicalPath = Server.MapPath(virtualPath);
        var absolutePaths = Directory.GetFiles(physicalPath, "*.*", SearchOption.AllDirectories);                       

        var relativePaths = new List<string>();
        foreach (var absolutePath in absolutePaths)
        {                
            var splittedPath = virtualPath.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);               
            var virtualFolderName = splittedPath[splittedPath.Length -1];
            var relativePath = absolutePath
                .Substring(absolutePath.IndexOf(virtualFolderName))
                .Replace("\\", "/");                

            relativePaths.Add(Url.Content("~/" + relativePath));
        }

        return relativePaths;
    }

1 Ответ

3 голосов
/ 29 февраля 2012

Следующее кажется короче:

private IEnumerable<string> GetRelativePathsToRoot(string virtualPath)
{
    var physicalPath = Server.MapPath(virtualPath);
    var absolutePaths = Directory.EnumerateFiles(
        physicalPath, 
        "*.*", 
        SearchOption.AllDirectories
    );
    return absolutePaths.Select(
        x => Url.Content(virtualPath + x.Replace(physicalPath, ""))
    );
}

Также обратите внимание, что вместо Directory.GetFiles я использую Directory.EnumerateFiles. Этот метод был введен в .NET 4.0 и возвращает IEnumreable<string> вместо string[]. Преимущества этого более чем очевидны. Внутренне этот метод использует функции FindFirstFile и FindNextFile Win32. Это означает, что фактический поиск в файловой системе выполняется только тогда, когда вы начинаете перечисление по набору результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...