Получить имя файла из строки 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; }
- Расширение файла кода C ++? .cc vs .cpp
- Как перебирать файлы в каталоге с помощью Bash?
- Разбиение имени файла на имя, расширение
- Log4net катит ежедневное имя файла с датой в имени файла
- Разрешенные символы в имени файла
Вы можете просто создать объект 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");