2016-04-18 3 views
1

Я делаю простое приложение, которое должно извлекать все изображения в подкаталогах с сайта и локально создавать структуру файлов и папок. Вот то, что я до сих пор:Как я могу сделать этот искатель изображений более эффективным?

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

Есть ли более быстрый способ определения, существует ли файл на веб-сервере

Вы можете отправить запрос HEAD, на веб-сервере.

Если веб-сервер поддерживает этот метод, проверьте возвращенный код состояния.

  • Когда код состояния равен 200, это означает, что файл существует.
  • Когда код состояния равен 404, это означает, что файл не существует.

С другой стороны, если веб-сервер не поддерживает этот метод, вы возвращаетесь к исходному коду.

Смотрите этот SO вопрос подробности: How to send a HEAD request with WebClient in C#?

путь я создать структуру папок, это является подходящим способом

Существует инвариант в //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"); 

      // ... 
     } 
    } 
} 
Смежные вопросы