Как сохранить изображение из http-клиента в определенную папку в UWP

#c# #uwp

Вопрос:

У меня есть небольшая функция, которая сохранит изображение с http-клиента, но у меня есть 2 проблемы.

  1. Изображение сохраняется в папке bin, и в созданном мной проекте есть папка «фотографии», в которой я хочу сохранить код.
  2. Я хочу получить еще 8 изображений и не перезаписывать текущее изображение, так как другой вызов перепишет изображение. Мой код, как показано ниже, разные идентификаторы дадут разные изображения:
 using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(HttpMethod.Get, url id))
    {
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
        using (
            Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync(),
            stream = new FileStream("test", FileMode.Create, FileAccess.Write))
        {
            await contentStream.CopyToAsync(stream);
        }
    }
}
 

Таким образом, результатом стал файл под названием test, но он перезаписывает предыдущий. Я хочу сохранить их все и сохранить в папке в проекте. Как бы я поступил с этим? Любые предложения приветствуются, спасибо.

Комментарии:

1. Попробуйте изменить имя файла с "test" на что-то вроде $"test {id}" .

2. При запуске скомпилированного приложения не существует понятия «проект».

Ответ №1:

1.

Выполнение new FileStream("test", ...) откроет новый поток файлов, в .test котором мы не хотим, как . и в каталоге, в котором выполняется ваша программа. Вместо этого все данные приложения должны поступать в Environment.SpecialFolder.ApplicationDataYourApplicationName так:

 var photoLocation = Path.Combine(Environment.SpecialFolder.ApplicationData, "MyUwpApp", "Photos", "test");

// Ensure %AppData%MyUwpAppPhotos exists, if not create it
if (!Directory.Exists(Path.GetDirectoryName(photoLocation))
    Directory.CreateDirectory(Path.GetDirectoryName(photoLocation));

stream = new FileStream(photoLocation, FileMode.Create, FileAccess.Write);
 

Вы можете проверить, существует ли каталог или нет вне цикла, чтобы проверить его только один раз. Но тогда ваша программа может выйти из строя, если Photos MyUwpApp она будет удалена во время цикла. Вы также можете сохранить возвращаемое значение Path.GetDirectoryName(photoLocation) , если действительно захотите, чтобы избежать необходимости вызывать его дважды.

2.

Вам нужны уникальные имена файлов. Самый простой способ сделать это-добавить id в каждый файл, как сказал Рой Коэн в своем комментарии:

 var photoLocation = Path.Combine(Environment.SpecialFolder.ApplicationData, "MyUwpApp", "Photos", "test", id.ToString());
 

Комментарии:

1. Спасибо, однако, когда я запускаю это, я получаю ошибку «отказано в разрешении» на указанный мной путь.

2. @Megatron213 вы можете объявить о возможности доступа к широким файлам в package.appxmainfest. Это ограниченная возможность. Доступ настраивается в Настройках > > Конфиденциальность > > Файловая система .