Вы можете использовать .NET анонимные типы и LINQ, как показано ниже, код из ClipFlair (http://clipflair.codeplex.com) Страница ввода метаданных галереи (предполагается использование выражения System.Linq):
private string path = HttpContext.Current.Server.MapPath("~/activity");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //only at page 1st load
{
listItems.DataSource =
Directory.EnumerateFiles(path, "*.clipflair")
.Select(f => new { Filename=Path.GetFileName(f) });
listItems.DataBind(); //must call this
}
}
Приведенный выше фрагмент получает все файлы * .clipflair из папки ~ / activity вашего веб-проекта
Обновление: использование EnumerateFiles (доступно с .NET 4.0) вместо GetFiles, поскольку это более эффективно для запросов LINQ. GetFiles вернет в память целый массив имен файлов, прежде чем LINQ сможет его отфильтровать.
В следующем фрагменте показано, как использовать несколько фильтров (на основе ответа на Можете ли вы вызвать Directory.GetFiles () с несколькими фильтрами? ), которые GetFiles / EnumerateFiles сами не поддерживают:
private string path = HttpContext.Current.Server.MapPath("~/image");
private string filter = "*.png|*.jpg";
protected void Page_Load(object sender, EventArgs e)
{
_listItems = listItems;
if (!IsPostBack)
{
listItems.DataSource =
filter.Split('|').SelectMany(
oneFilter => Directory.EnumerateFiles(path, oneFilter)
.Select(f => new { Filename = Path.GetFileName(f) })
);
listItems.DataBind(); //must call this
if (Request.QueryString["item"] != null)
listItems.SelectedValue = Request.QueryString["item"];
//must do after listItems.DataBind
}
}
Фрагмент ниже показывает, как получить все каталоги из папки / ~ video, а также отфильтровать их, чтобы выбрать только каталоги, которые содержат файл .ism (содержимое Smooth Streaming) с тем же именем, что и каталог (например, someVideo / someVideo.ism )
private string path = HttpContext.Current.Server.MapPath("~/video");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //only at page 1st load
{
listItems.DataSource =
Directory.GetDirectories(path)
.Where(f => (Directory.EnumerateFiles(f, Path.GetFileName(f) + ".ism").Count() != 0))
.Select(f => new { Foldername = Path.GetFileName(f) });
//when having a full path to a directory don't use Path.GetDirectoryName (gives parent directory),
//use Path.GetFileName instead to extract the name of the directory
listItems.DataBind(); //must call this
}
}
Приведенные выше примеры взяты из DropDownList, но это та же логика с любым элементом управления ASP.net, который поддерживает привязку данных (обратите внимание, я называю Foldername поле данных во втором фрагменте и имя файла в первом, но можно использовать любое имя, необходимо указать это в разметке):
<asp:DropDownList ID="listItems" runat="server" AutoPostBack="True"
DataTextField="Foldername" DataValueField="Foldername"
OnSelectedIndexChanged="listItems_SelectedIndexChanged"
/>