我正在制作一个简单的应用程序,它必须从站点获取子目录中的所有图像,并在本地重新创建文件和文件夹结构。以下是我目前所拥有的:
string folder = "c:someLocalFolder";
// To keep track of how many files that are processed
int i = 0;
// Folder x
for (int x = 2; x <= 7; x++)
{
// Folder y
for (int y = 0; y < 80; y++)
{
//File z
for (int z = 0; z <= 70; z++)
{
// File, increment
i++;
string destFolderPath = Path.Combine(folder, x.ToString(), y.ToString());
string filePath = Path.Combine(destFolderPath, z.ToString() + ".png");
if (!File.Exists(filePath))
{
var url = string.Format("http://www.somesite.com/images/{0}/{1}/{2}.png", x, y, z);
if (!Directory.Exists(destFolderPath))
// Folder doesnt exist, create
Directory.CreateDirectory(destFolderPath);
var webClient = new WebClient();
webClient.DownloadFileCompleted += (o, e) =>
{
// less than 1 byte recieved, delete
if( (new FileInfo(filePath).Length) < 1 )
{
File.Delete(filePath);
}
// File processed
i--;
Console.WriteLine(i);
};
webClient.DownloadFileAsync(new Uri(url), filePath);
}
else
{
// File processed
i--;
Console.WriteLine(i);
}
}
}
}
因此,正如你目前所看到的,我正在迭代和创建文件夹结构,然后异步下载文件,然后检查文件大小是否小于1字节,如果小于1字节则将其删除。
我认为我做这件事的方式很繁琐,速度不是很快,而且它让很多文件只做了一次删除,不符合要求。
有没有更快的方法来确定文件是否存在于网络服务器上,并基于下载(如果存在)和我创建文件夹结构的方式,这是我实现目标的合适方式?
有没有更快的方法来确定文件是否存在于网络服务器上
您可以向Web服务器发送HEAD请求。
如果Web服务器支持该方法,请检查返回的状态代码。
- 当状态代码为200时,表示该文件确实存在
- 当状态代码为404时,表示该文件不存在
另一方面,如果Web服务器不支持此方法,则回退到原始代码。
有关详细信息,请参阅此SO问题:如何在C#中使用WebClient发送HEAD请求?
我创建文件夹结构的方式,这是的合适方式吗
循环的//File z
中有一个不变量:
string destFolderPath = Path.Combine(folder, x.ToString(), y.ToString());
试试这个:
// Folder x
for (int x = 2; x <= 7; x++) {
string xAsString = x.ToString();
// Folder y
for (int y = 0; y < 80; y++) {
string destFolderPath = Path.Combine(folder, xAsString, y.ToString());
//File z
for (int z = 0; z <= 70; z++) {
// File, increment
i++;
string filePath = Path.Combine(destFolderPath, z.ToString() + ".png");
// ...
}
}
}