我们可以说我可以通过一个看起来类似于some.com/folderIndex/folderIndex_fileIndex.txt的网址从网站获取某些txt文件,而且我不知道确切的文件数量,但是我想获取所有文件夹中所有文件的URL。这样做的最佳方式是什么?目前我正在做以下事情。
public async void GetValidFolderCount()
{
bool valid = true;
int folderIndex = 0;
using (var client = new HttpClient())
{
while (valid)
{
folderIndex++;
string url = String.Format("{0}/{1}", rootUrl, folderIndex);
var result = await client.GetAsync(new Uri(url));
if (result.StatusCode != HttpStatusCode.OK)
{
valid = false;
break;
}
FolderCount++;
bool res = await GetValidFileCount(folderIndex, url);
}
}
GetComplete = true;
}
不过,我必须在这里使用Task<bool>
因为没有它,每次都会有不同的网址数量。
public async Task<bool> GetValidFileCount(int folderIndex, string baseUrl)
{
bool valid = true;
int fileIndex = 0;
using (var client = new HttpClient())
{
while (valid)
{
fileIndex++;
string fileName = folderIndex + "_" + ((fileIndex < 10) ? ("0" + fileIndex) : fileIndex.ToString()) + fileExtension;
string fileAddress = String.Format("{0}/{1}", baseUrl,fileName);
try
{
var result = await client.GetAsync(new Uri(fileAddress));
if (result.StatusCode != HttpStatusCode.OK)
{
valid = false;
break;
}
}
catch
{
continue;
}
UrlRepository.UrlList.Add(fileAddress);
}
}
return true;
}
这种方法需要2分钟,我很确定它不会被认为是有效的,但最终的项目总数大约是1900,所以我不太确定。
我还考虑了以下方法:解析HTML并找到锚点,但这似乎不是一个好主意。
UPD:总体目标是下载所有文件,但是我必须实现一个进度条,它会显示我下载的文件数和剩余的文件数,所以我认为事先得到了url#s因为我得到了文件的数量而且我得到了网址,这是个好主意。答案 0 :(得分:3)
HTTP没有&#34;列表文件&#34;命令,如果你想要发现目录中存在的文件(假设服务器实际上从该目录提供文件),你可以选择两个选项:
后一种选择更可行。
当然,你可以做得更聪明,授予文件的编号可预测和连续。您可以执行某种二进制搜索。
这完全取决于你的实际目标,但你没有解释。鉴于问题中的信息,我只是解析索引文档的HTML。