Найдите имя файла zip-файла в заданном URL-адресе

Как найти файлы с «*.zip» по URL-адресу с включенным просмотром каталогов с помощью С#. Например: если мой URL: http://www.example.com/myfolder/myfiles и путь состоит из файлов: ex1.htm,ex2.zip,ex.pdf,ex.swf, тогда как я могу найти имя файла с расширением *.zip. Пожалуйста, помогите мне, как найти имя файла zip-файла в URL-адресе


person Tinoy Jameson    schedule 06.07.2012    source источник
comment
Этот пост SO может вам помочь, он объясняет, как вы можете проанализировать список каталогов URL-адреса, stackoverflow.com/questions/124492/ . Синтаксический анализ — это первый шаг, затем после его анализа вы можете фильтровать файлы .zip.   -  person Despertar    schedule 06.07.2012
comment
Тиной, под "поиском файлов" ты имеешь ввиду скачивание? Если скачивание допустимо, то у меня есть предложение, я думаю.   -  person RAJ    schedule 06.07.2012
comment
Нет, мне нужно только имя файла zip, присутствующего в этой папке. Я думаю, мы можем использовать регулярное выражение, чтобы найти zip-файл в HTML-документе URL-адреса.   -  person Tinoy Jameson    schedule 06.07.2012
comment
да точно, я тоже о том же думаю   -  person RAJ    schedule 06.07.2012


Ответы (4)


Если FTP-сервер также не доступен, я думаю, вам придется прибегнуть к загрузке списка каталогов с помощью HttpWebRequest, а затем анализировать результаты, чтобы извлечь все hrefs в тегах ‹A>.

Вот пример кода:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string html = reader.ReadToEnd();
                Console.WriteLine("Parsing {0}", html);
                Regex regex = new Regex("href=\\\"([^\\\"]*)", RegexOptions.IgnoreCase);
                MatchCollection matches = regex.Matches(html);
                if (matches.Count > 0)
                {
                    foreach (Match match in matches)
                    {
                        if (match.Success)
                        {
                            Console.WriteLine("Found {0}", match.Captures[0]);
                        }
                    }
                }
            }
        }

Обратите внимание, что полученные вами значения href будут относиться к текущему каталогу.

person Michael    schedule 06.07.2012

string[] s = Directory.GetFiles(path);
        int i = 0;
        while (i < s.Length)
        {
            if (s[i].Substring((s[i].IndexOf(".") + 1), 3).Equals("zip"))
            {
                Response.Write(s[i].ToString());
                i = i + 1;
            }
        }

Попробуй это.

ИЗМЕНИТЬ

int slashIndex = url.lastIndexOf('/'); 
int dotIndex = url.lastIndexOf('.zip', slashIndex);
String filenameWithoutExtension; 
if (dotIndex == -1) 
{   
     filenameWithoutExtension = url.substring(slashIndex + 1); 
} 
else 
{   
     filenameWithoutExtension = url.substring(slashIndex + 1, dotIndex); 
} 

Это работает для URL-адреса, где имена файлов прикреплены в конце/я оставлю вам обработку ошибок/

person akhil    schedule 06.07.2012
comment
Мы не можем использовать Directory.GetFiles, потому что здесь используется URL-адрес, а не каталог. Я получаю следующее исключение при использовании Directory.GetFiles: форматы URI не поддерживаются. - person Tinoy Jameson; 06.07.2012
comment
Я не думаю, что вы можете получить доступ к файлам в веб-адресе. Взгляните на мой отредактированный ответ - person akhil; 06.07.2012
comment
Привет Ахил .. Мой URL-адрес не состоит из zip-файла. Например: если мой URL-адрес example.com/folder, то в этом пути к папке много файлов... я не знаю имен файлов в этой папке. Могу ли я получить имена файлов в этой папке в списке коллекций?? - person Tinoy Jameson; 06.07.2012
comment
Но я не могу напрямую перейти к папке веб-сайта. - person akhil; 06.07.2012
comment
Но Ахил, мы можем просмотреть папку веб-сайта, включив просмотр каталога в IIS. - person Tinoy Jameson; 06.07.2012
comment
Позвольте мне немного покопаться в этом. Вернемся к вам в ближайшее время. - person akhil; 06.07.2012
comment
Спасибо, Ахил. Я тоже пытаюсь это сделать. Надеюсь, что через некоторое время найду хорошее решение... - person Tinoy Jameson; 06.07.2012

По предложению Михаила я получил решение вопроса следующим образом:

string urlpath = "http://www.example.com/folder/"
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlpath);
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
       using (StreamReader reader = new StreamReader(response.GetResponseStream()))
       {
           string html = reader.ReadToEnd();
           Regex regEx = new Regex(@".*/(?<filename>.*?)\.zip");
           MatchCollection matches = regEx.Matches(html);
           if (matches.Count > 0)
           {
                foreach (Match match in matches)
                {
                  if (match.Success)
                  {

                    Console.WriteLine(match.Groups["filename"].Value);
                  }
            }
       }

   }
person Tinoy Jameson    schedule 06.07.2012

Вы можете использовать GetFileName для получения имени файла.

Например:

System.IO.Path.GetFileName(path);

OR

Вы можете попробовать следующее, чтобы получить имя файла из каталога:

var filenames = String.Join(", ", Directory.GetFiles(@"c:\", "*.zip").Select(filename => Path.GetFileNameWithoutExtension(filename)).ToArray());

person RAJ    schedule 06.07.2012
comment
На самом деле мой путь - это путь к папке (example.com/folderpath), и мне нужно имя файла zip-файлы присутствуют в этом пути к каталогу. Как я могу получить имя файла zip-файла ?? - person Tinoy Jameson; 06.07.2012
comment
Итак, вы можете попробовать: var filenames = String.Join(, , Directory.GetFiles(@c:\, *.zip).Select(filename => Path.GetFileNameWithoutExtension(filename)).ToArray()); - person RAJ; 06.07.2012
comment
Функция Directory.GetFiles() возвращает только файлы в каталоге. Но здесь я использую файлы в URL-адресе, а не в каталоге. Когда мы используем URL-адрес (example.com/ filderpath) в Directory.GetFiles.. он возвращает исключение в недопустимом формате URI.. - person Tinoy Jameson; 06.07.2012
comment
Вы можете просто создать объект System.Uri и использовать IsFile, чтобы убедиться, что это файл, а затем Uri.LocalPath, чтобы извлечь имя файла. - person RAJ; 06.07.2012
comment
В URL-адресе много файлов. Мне нужно извлечь все файлы в URL-адресе в локальный каталог, чтобы найти zip-файл. Можете ли вы предложить какой-либо другой метод без извлечения всех файлов из URL-адреса в локальный путь ?? - person Tinoy Jameson; 06.07.2012
comment
Да, я думаю, вы можете использовать регулярное выражение для получения только zip - person RAJ; 06.07.2012