<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Just Developer Blog, заметки с тегом: WebClient</title>
<link>http://bibobo.ru/tags/webclient/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Сохранение файлов из сети на диск в публичную директорию (Android)</title>
<guid isPermaLink="true">http://bibobo.ru/all/sohranenie-faylov-iz-seti-na-disk-v-publichnuyu-direktoriyu-andr/</guid>
<link>http://bibobo.ru/all/sohranenie-faylov-iz-seti-na-disk-v-publichnuyu-direktoriyu-andr/</link>
<comments>http://bibobo.ru/all/sohranenie-faylov-iz-seti-na-disk-v-publichnuyu-direktoriyu-andr/</comments>
<description>&lt;p&gt;Практически любому приложению, которое позволяет обмениваться контентом необходимо скачивать данные из сети и сохранять их на диск устройства. Существует два распространенных способа это сделать:&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Скачать и сохранить файл вручную;&lt;/li&gt;
&lt;li&gt;Использовать класс &lt;i&gt;DownloadManager&lt;/i&gt; и доверить работу ему.&lt;br /&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;При этом скачанные файлы не будут видны приложениям на устройстве до тех пор, пока разработчик самостоятельно не сделает их доступными (либо до следующей перезагрузке устройства).&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;В этой статье мы рассмотрим ручной способ сохранения на диск применительно к Xamarin.Android. Более интересный вариант с использованием &lt;i&gt;DownloadManager&lt;/i&gt; будет рассмотрен в другой статье.&lt;/p&gt;
&lt;p&gt;&lt;input id="button_android_download_save_file1" type="button" onclick="toggle(cut_android_download_save_file1, button_android_download_save_file1)" value="Читать дальше" hiddenText="Свернуть" visibleText="Читать дальше"&gt;&lt;/p&gt;
&lt;div id="cut_android_download_save_file1" style="display: none;" displayOld=""&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Для начала необходимо получить массив байт файла из сети (например по его URL). Для этого можно использовать например простейший &lt;i&gt;WebClient&lt;/i&gt;, написать примерно такой код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;string url = “url_к_нашему_файлу”;
byte[] dataBytes = new System.Net.WebClient().DownloadData(url);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее необходимо сохранить полученный массив байт как файл на диске. Для этого сначала необходимо получить путь до одной из публичных директорий, они могут быть следующими:&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Environment.DirectoryMusic;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryPodcasts;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryRingtones;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryAlarms;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryNotifications;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryPictures;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryMovies;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryDownloads;&lt;/li&gt;
&lt;li&gt;Environment.DirectoryDcim.&lt;br /&gt;
&lt;br/&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Назначение директорий вполне ясно из их названия, будем использовать &lt;i&gt;Environment.DirectoryDownloads&lt;/i&gt;. Напишем следующий код (пояснение в комментариях):&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;//получаем путь к директории с загрузками
string dirPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
//если директории нет (такое может быть, да О_о, создадим ее)
if (!Directory.Exists(dirPath))
{
    Directory.CreateDirectory(dirPath);
}

//получаем путь до конечного файла в нашей директории, если он уже есть - удалим его
string filePath = Path.Combine(dirPath, file.Name);
if (File.Exists(filePath))
{
    File.Delete(filePath);
}

//записываем массив байт на диск
File.WriteAllBytes(filePath, fileBytes);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Почти готово, осталось только объявить системе о том, что на диске теперь есть новый файл, доступный всем вокруг. Для этого используется подсистема Android, которая называется &lt;i&gt;MediaScanner&lt;/i&gt;. Существует несколько способов работы с МедиаСканнером, все они обладают разным уровнем гибкости и сложности. Мы воспользуемся самым простым — отправим широковещательный интент системе, МедиаСканнер его поймает и сделает добавит файл в свою базу.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;//объявим МедиаСканеру о том, что появился новый файл
Intent mediaScannerIntent = new Intent(Intent.ActionMediaScannerScanFile);
mediaScannerIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(filePath)));
SendBroadcast(mediaScannerIntent);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
<pubDate>Wed, 02 Dec 2015 22:06:16 +0300</pubDate>
</item>


</channel>
</rss>