Проверьте, является ли путь ввода URL-адрес или локальный файл - PullRequest
19 голосов
/ 27 марта 2010

Я работаю в xmldataprovider, и у нас есть значение конфигурации «source», это может быть локальный файл или URL как

c: \ data \ test.xml --absolute data \ test.xml --relative

или URL http: \ mysite \ test.xml

как я могу определить все эти случаи в коде Я работаю с #

Ответы [ 4 ]

31 голосов
/ 27 марта 2010
private static bool IsLocalPath(string p)
{
  return new Uri(p).IsFile;
}

... или, если вы хотите включить поддержку определенных недействительных URI ...

private static bool IsLocalPath(string p)
{
  if (p.StartsWith("http:\\"))
  {
    return false;
  }

  return new Uri(p).IsFile;
}

Пример использования

static void Main(string[] args)
{
  CheckIfIsLocalPath("C:\\foo.txt");
  CheckIfIsLocalPath("C:\\");
  CheckIfIsLocalPath("http://www.txt.com");
}

private static void CheckIfIsLocalPath(string p)
{
  var result = IsLocalPath(p); ;

  Console.WriteLine("{0}  {1}  {2}", result, p, new Uri(p).AbsolutePath);
}
2 голосов
/ 16 февраля 2017

Простое использование new Uri(yourPath) не будет работать во всех случаях.

Сравнение различных сценариев (через LinqPad).

    var tests = new[] {
        Path.GetTempFileName(),
        Path.GetDirectoryName(Path.GetTempFileName()),
        "http://in.ter.net",
        "http://in.ter.net/",
        "http://in.ter.net/subfolder/",
        "http://in.ter.net/subfolder/filenoext",
        "http://in.ter.net/subfolder/file.ext",
        "http://in.ter.net/subfolder/file.ext?somequerystring=yes",
        Path.GetFileName(Path.GetTempFileName()),
        Path.Combine("subfolder", Path.GetFileName(Path.GetTempFileName())),
    };

    tests.Select(test => {
        Uri u;
        try {
            u = new Uri(test);
        } catch(Exception ex) {
            return new {
                test,
                IsAbsoluteUri = false,
                // just assume
                IsFile = true,
            };
        }

        return new {
            test,
            u.IsAbsoluteUri,
            u.IsFile,
        };
    }).Dump();

Результаты

Linqpad results of path checking

1 голос
/ 19 декабря 2017

В случае неправильного пути (несуществующий путь, пустая строка, пустая строка) Uri (p) .IsFile выдает исключение. На мой взгляд, лучше использовать два метода, чтобы понять, что к чему:

private bool PathIsLocalFile(string path)
{
    return File.Exists(path);
}

private bool PathIsUrl(string path)
{
    if (File.Exists(path))
        return false;
    try
    {
        Uri uri = new Uri(path);
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

//

Microsoft docs: 
public static bool Exists(string path);

Возвращает: Значение true, если вызывающая сторона имеет необходимые разрешения, а путь содержит имя существующего файла; иначе ложно. Этот метод также возвращает false, если path имеет значение null, неверный путь или строку нулевой длины. Если у вызывающей стороны недостаточно прав для чтения указанного файла, исключение не выдается, и метод возвращает значение false независимо от наличия пути. //

Microsoft docs: 
public Uri(string uriString);

Исключения:

T:System.ArgumentNullException:

Значение uriString равно нулю.

T:System.UriFormatException:

uriString пусто. Или Схема, указанная в uriString, сформирована неправильно. См. System.Uri.CheckSchemeName (System.String) .- or- uriString содержит слишком много косых черт. -Или- Пароль, указанный в uriString, недействителен. -Или- Имя хоста, указанное в uriString, недопустимо. -Или- имя файла, указанное в uriString, недопустимо. -ИЛИ- Имя пользователя, указанное в uriString, недопустимо. -или- Имя хоста или полномочия, указанное в uriString, не может быть прервано обратными косыми чертами. -или- Номер порта, указанный в uriString, недопустим или не может быть проанализирован. Длина uriString превышает 65519 символов. -Или- Длина схемы, указанной в uriString, превышает 1023 символа. -Или- Недопустимая последовательность символов в uriString.-or- Путь MS-DOS, указанный в uriString, должен начинаться с c : \ *. * 1016

1 голос
/ 27 марта 2010

Просто установите правило для всех удаленных файлов, оно должно (и должно) включать протокол в URI:

http://
ftp://

и для локального файла это может быть

file://

для абсолютного пути и без протокола для относительного.

Тогда простое регулярное выражение может помочь извлечь нужную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...