Как получить список файлов из веб-каталога?
Как получить список файлов из веб-каталога? Если я получаю доступ к URL-адресу веб-каталога, в интернет-браузере перечисляются все файлы в этом каталоге. Теперь я просто хочу получить этот список в C# и загрузить их в BITS (Background Intelligent Transfer Service) .
5 ответов
О части "получить этот список в C#":
foreach (string filename in
Directory.GetFiles(
Server.MapPath("/"), "*.jpg",
SearchOption.AllDirectories))
{
Response.Write(
String.Format("{0}<br />",
Server.HtmlEncode(filename)));
}
private void ListFiles()
{
//get the user calling this page
Gaf.Bl.User userObj = base.User;
//get he debug directory of this user
string strDebugDir = userObj.UserSettings.DebugDir;
//construct the Directory Info directory
DirectoryInfo di = new DirectoryInfo(strDebugDir);
if (di.Exists == true)
{
//get the array of files for this
FileInfo[] rgFiles = di.GetFiles("*.html");
//create the list ... .it is easier to sort ...
List<FileInfo> listFileInfo = new List<FileInfo>(rgFiles);
//inline sort descending by file's full path
listFileInfo.Sort((x, y) => string.Compare(y.FullName, x.FullName));
//now print the result
foreach (FileInfo fi in listFileInfo)
{
Response.Write("<br><a href=" + fi.Name + ">" + fi.Name + "</a>");
} //eof foreach
} //eof if dir exists
} //eof method
Что ж, если веб-сервер позволяет перечислять файлы в каталоге, о котором идет речь, все готово.
К сожалению, нет никакого стандарта на то, как веб-сервер должен возвращать вам список. Это часто в HTML, но HTML не всегда форматируется одинаково на нескольких веб-серверах.
Если вы хотите всегда загружать файлы из одного и того же каталога на одном и том же веб-сервере, просто выполните "просмотр источника", находясь в каталоге в вашем веб-браузере. Затем попробуйте написать небольшое регулярное выражение, которое будет извлекать все имена файлов из источника HTML.
Затем вы можете создать WebClient, запросить URL-адрес каталога, проанализировать ответ, чтобы получить имена файлов с вашим регулярным выражением, а затем обработать файлы с помощью вашего клиента BITS.
Надеюсь это поможет
Я пишу некоторый код, который может получить всю информацию о пути, включая file и dir, с сайта IIS, которые разрешают каталог со списком. Вы можете настроить регулярное выражение в соответствии с вашими потребностями (или перейти на использование html-анализатора). Кроме того, вы можете добавить код самостоятельно, чтобы получить более подробную информацию, такую как размер файла или время создания.
Вы можете получить всю информацию о пути в 2 строки:
List<PathInfo> pathInfos = new List<PathInfo>();
HttpHelper.GetAllFilePathAndSubDirectory("http://localhost:33333/", pathInfos);
Код помощника:
public static class HttpHelper
{
public static string ReadHtmlContentFromUrl(string url)
{
string html = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
html = reader.ReadToEnd();
}
//Console.WriteLine(html);
return html;
}
public static void GetAllFilePathAndSubDirectory(string baseUrl, List<PathInfo> pathInfos)
{
Uri baseUri = new Uri( baseUrl.TrimEnd('/') );
string rootUrl = baseUri.GetLeftPart(UriPartial.Authority);
Regex regexFile = new Regex("[0-9] <a href=\"(http:|https:)?(?<file>.*?)\"", RegexOptions.IgnoreCase);
Regex regexDir = new Regex("dir.*?<a href=\"(http:|https:)?(?<dir>.*?)\"", RegexOptions.IgnoreCase);
string html = ReadHtmlContentFromUrl(baseUrl);
//Files
MatchCollection matchesFile = regexFile.Matches(html);
if (matchesFile.Count != 0)
foreach (Match match in matchesFile)
if (match.Success)
pathInfos.Add(
new PathInfo( rootUrl + match.Groups["file"], false));
//Dir
MatchCollection matchesDir = regexDir.Matches(html);
if (matchesDir.Count != 0)
foreach (Match match in matchesDir)
if (match.Success)
{
var dirInfo = new PathInfo(rootUrl + match.Groups["dir"], true);
GetAllFilePathAndSubDirectory(dirInfo.AbsoluteUrlStr, dirInfo.Childs);
pathInfos.Add(dirInfo);
}
}
public static void PrintAllPathInfo(List<PathInfo> pathInfos)
{
pathInfos.ForEach(f =>
{
Console.WriteLine(f.AbsoluteUrlStr);
PrintAllPathInfo(f.Childs);
});
}
}
public class PathInfo
{
public PathInfo(string absoluteUri, bool isDir)
{
AbsoluteUrl = new Uri(absoluteUri);
IsDir = isDir;
Childs = new List<PathInfo>();
}
public Uri AbsoluteUrl { get; set; }
public string AbsoluteUrlStr
{
get { return AbsoluteUrl.ToString(); }
}
public string RootUrl
{
get { return AbsoluteUrl.GetLeftPart(UriPartial.Authority); }
}
public string RelativeUrl
{
get { return AbsoluteUrl.PathAndQuery; }
}
public string Query
{
get { return AbsoluteUrl.Query; }
}
public bool IsDir { get; set; }
public List<PathInfo> Childs { get; set; }
public override string ToString()
{
return String.Format("{0} IsDir {1} ChildCount {2} AbsUrl {3}", RelativeUrl, IsDir, Childs.Count, AbsoluteUrlStr);
}
}
Это интересная тема, которую я исследовал сравнительно недавно. Как вы знаете, вы можете получить доступ к BITS через COM, но вот пара проектов, чтобы сделать это проще:
SharpBITS.NET
Фоновая оболочка Интеллектуальной службы передачи (BITS)
Эта статья на MSDN может быть немного больше, чем вы хотите знать.
Я экспериментировал с кодом в ссылке CodeProject, и он, казалось, работал достаточно хорошо. Проект CodePlex выглядит действительно хорошо, но я не пробовал.