У меня есть объект Uri, передаваемый конструктору моего класса.

Я хочу открыть файл, на который указывает Uri, будь то локальный, сетевой, http, что угодно, и прочитать его содержимое в виде строки. Есть ли простой способ сделать это, или мне нужно попытаться отработать такие вещи, как Uri.IsFile, чтобы выяснить, как попытаться его открыть?

8
Matthew Scharley 1 Июл 2009 в 14:39

2 ответа

Лучший ответ
static string GetContents(Uri uri) {
    using (var response = WebRequest.Create(uri).GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream))
        return reader.ReadToEnd();
}

Это не сработает для чего угодно . Он работает для file://, http:// и https:// и ftp:// по умолчанию. Однако вы можете зарегистрировать пользовательские обработчики URI с помощью WebRequest.RegisterPrefix, чтобы он работал и для них.

11
mmx 1 Июл 2009 в 14:51

Самый простой способ - использовать класс WebClient:

using(WebClient client = new WebClient())
{
    string contents = client.DownloadString(uri);
}
5
caesay 1 Май 2016 в 11:27
1
К сожалению, он не является потокобезопасным, что является проблемой, и, насколько я могу судить с первого взгляда, он поддерживает только HTTP (мне также нужен как минимум file: //)
 – 
Matthew Scharley
1 Июл 2009 в 15:04
@Matthew: Внутри он просто использует WebRequest, поэтому поддерживает file: // и ftp: // тоже. Если вам нужен больший контроль, вы должны использовать WebRequest напрямую. Если вы просто хотите вернуть строку, используйте WebClient.
 – 
mmx
1 Июл 2009 в 15:06
Он поддерживает другие URI. Это не ограничивается HTTP. И что вы имеете в виду, говоря о поточно-ориентированности?
 – 
Philippe Leybaert
1 Июл 2009 в 15:06
3
Если вам нужно несколько потоков - используйте несколько экземпляров WebClient. Здесь нет проблемы безопасности потоков ...
 – 
Marc Gravell
1 Июл 2009 в 15:19