Получить имя файла из строки URI в C #

У меня есть этот метод для захвата имени файла из URI строки. Что я могу сделать, чтобы сделать его более надежным?

private string GetFileName(string hrefLink) { string[] parts = hrefLink.Split('/'); string fileName = ""; if (parts.Length > 0) fileName = parts[parts.Length - 1]; else fileName = hrefLink; return fileName; } 

Вы можете просто создать объект System.Uri и использовать IsFile для проверки его файла, а затем Uri.LocalPath для извлечения имени файла.

Это намного безопаснее, так как это дает вам возможность проверить правильность URI.


Редактировать в ответ на комментарий:

Чтобы получить только полное имя файла, я бы использовал:

 Uri uri = new Uri(hreflink); if (uri.IsFile) { string filename = System.IO.Path.GetFileName(uri.LocalPath); } 

Это делает всю проверку ошибок для вас и нейтральна для платформы. Все специальные случаи обрабатываются для вас быстро и легко.

Uri.IsFile не работает с http-адресами. Он работает только для «file: //». Из MSDN : «Свойство IsFile истинно, когда свойство Scheme равно UriSchemeFile». Поэтому вы не можете зависеть от этого.

 Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.LocalPath); 

Большинство ответов либо неполное, либо не обрабатывают материал, идущий после пути (строка запроса / хеш).

 readonly static Uri SomeBaseUri = new Uri("http://canbeanything"); static string GetFileNameFromUrl(string url) { Uri uri; if (!Uri.TryCreate(url, UriKind.Absolute, out uri)) uri = new Uri(SomeBaseUri, url); return Path.GetFileName(uri.LocalPath); } 

Результаты теста:

 GetFileNameFromUrl(""); // "" GetFileNameFromUrl("test"); // "test.xml" GetFileNameFromUrl("test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3#aidjsf"); // "test.xml" GetFileNameFromUrl("http://www.a.com/a/b/c/d"); // "d" GetFileNameFromUrl("http://www.a.com/a/b/c/d/e/"); // "" 

Принятый ответ проблематичен для http-адресов. Кроме того, Uri.LocalPath выполняет преобразования, специфичные для Windows, и, как Uri.LocalPath кто-то, оставляет там строки запроса. Лучше всего использовать Uri.AbsolutePath

Правильный способ сделать это для http-адресов:

 Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.AbsolutePath); 

Я думаю, что это сделает то, что вам нужно:

 var uri = new Uri(hreflink); var filename = uri.Segments.Last(); 
 using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(hrefLink.Replace("/", "\\")); } 

Это предполагает, конечно, что вы проанализировали имя файла.

РЕДАКТИРОВАТЬ № 2:

 using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "\\")); } 

Это должно обрабатывать пробелы и т. П. В имени файла.

это мой образец, который вы можете использовать:

  public static string GetFileNameValidChar(string fileName) { foreach (var item in System.IO.Path.GetInvalidFileNameChars()) { fileName = fileName.Replace(item.ToString(), ""); } return fileName; } public static string GetFileNameFromUrl(string url) { string fileName = ""; if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) { fileName = GetFileNameValidChar(Path.GetFileName(uri.AbsolutePath)); } string ext = ""; if (!string.IsNullOrEmpty(fileName)) { ext = Path.GetExtension(fileName); if (string.IsNullOrEmpty(ext)) ext = ".html"; else ext = ""; return GetFileNameValidChar(fileName + ext); } fileName = Path.GetFileName(url); if (string.IsNullOrEmpty(fileName)) { fileName = "noName"; } ext = Path.GetExtension(fileName); if (string.IsNullOrEmpty(ext)) ext = ".html"; else ext = ""; fileName = fileName + ext; if (!fileName.StartsWith("?")) fileName = fileName.Split('?').FirstOrDefault(); fileName = fileName.Split('&').LastOrDefault().Split('=').LastOrDefault(); return GetFileNameValidChar(fileName); } 

Применение:

 var fileName = GetFileNameFromUrl("http://cdn.p30download.com/?b=p30dl-software&f=Mozilla.Firefox.v58.0.x86_p30download.com.zip"); 
Interesting Posts

Преобразование с двойным преобразованием без научной нотации

Передача слишком большого количества аргументов printf

Как заставить IntentService немедленно остановить кнопку отмены из Activity?

Как добавить новые шрифты в Itext с помощью java

Получение ошибки из push-уведомления

Как получить продолжительность видео в секундах?

Как добавить каталог в заголовок C include include?

Загрузка файла не работает с AJAX в PrimeFaces 4.0 / JSF 2.2.x – javax.servlet.ServletException: тип содержимого запроса не является мультиформатным / форм-данным

std :: array vs array performance

Как сказать Windows 7 «спать, когда ноутбук закрыт, если не подключен внешний монитор; То используйте это?

есть ли css-хак для safari только НЕ хром?

Не удается увидеть окно PuTTY в Windows Vista

Самый точный способ выполнить комбинированную операцию умножения и деления в 64-битном режиме?

Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?

Безопасная загрузка для Linux?

Давайте будем гением компьютера.