Web ディレクトリからファイルのリストを取得するにはどうすればよいですか? Web ディレクトリの 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)));
}
これは私がかなり最近調査した興味深いトピックです。ご存じのとおり、COM 経由で BITS にアクセスできますが、簡単にするためのプロジェクトをいくつか紹介します。
SharpBITS.NET
フォーム デザイナーが使いやすい Background Intelligent Transfer Service (BITS) ラッパー
MSDN のこの記事は、あなたが知りたいと思っている以上のものかもしれません。
CodeProject リンクのコードを試してみたところ、かなりうまく機能しているように見えました。CodePlex プロジェクトは非常に良さそうに見えますが、まだ試していません。
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
Web サーバーが問題のディレクトリのファイルを一覧表示できる場合は、問題ありません。
残念ながら、Web サーバーがどのようにリストを返すかについての標準はありません。多くの場合、HTML で記述されますが、HTML は複数の Web サーバー間で常に同じ形式であるとは限りません。
常に同じ Web サーバーの同じディレクトリからファイルをダウンロードしたい場合は、Web ブラウザでそのディレクトリにいる間に「ソースの表示」を実行してください。次に、HTML ソースからすべてのファイル名を取得する小さな正規表現を作成してみてください。
次に、WebClient を作成し、ディレクトリ URL を要求し、応答を解析して正規表現でファイル名を取得し、BITS クライアントでファイルを処理します。
お役に立てれば
リストディレクトリを許可する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);
}
}