2017-02-14 11 views
0

У меня есть служба API, которая преобразует файлы и отправляет обратно преобразованный PDF-файл, на самом деле это контент, используя стандарт HttpClient с методом POST. Мне не нужна физическая копия файла на моем диске, но его эквивалент как класс StorageFile.Использование класса StorageFile, имеющего содержимое файла в UWP [Универсальная платформа Windows]

У меня есть некоторые вопросы по этой теме, к которой я не мог найти ответы в любом месте:

  1. Как создать файл, когда я получаю содержание его помощью StorageFile класса? Или мне нужно использовать другой класс для первоначального создания файла (например, File)? Рекомендуется ли в UWP?

  2. Есть ли способ использовать класс StorageFile без создания физической копии файла?

  3. Какой вариант лучше - сначала сохраните файл во временной папке, а затем используйте его или непосредственно создайте класс StorageFile? Зачем?

ответ

2

Как создать файл, когда я получаю содержание его, используя класс StorageFile? Или мне нужно использовать другой класс для первоначального создания файла (например, File)? Рекомендуется ли в UWP?

Полученный контент обычно представляет собой строковый формат. Возможно, вам нужно будет создать новый пустой файл в некотором месте, часто это локальная папка текущего приложения. Затем напишите содержимое в файл, который вы только что создали. Вот очень пример демо:

string content = "postcontent"; 
StorageFolder localfolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
Windows.Storage.StorageFile sampleFile = await localfolder.CreateFileAsync("sample.pdf", Windows.Storage.CreationCollisionOption.ReplaceExisting); 
await Windows.Storage.FileIO.WriteTextAsync(sampleFile, content); 

Подробнее о том, как создать и записать файл с StorageFile пожалуйста, ссылку this article. Обратите внимание, что это простой пример создания и записи файла, для реального pdf-файла, для этого требуется сложный формат записи содержимого в файл.

StorageFile класс предназначен для работы с файлами в uwp, мы используем этот класс для создания и записи файлов, другие классы могут быть не нужны. File класс, который принадлежит System.IO, пространство имен должно также использоваться в uwp, но рекомендуется StorageFile.

Есть ли способ использовать класс StorageFile без создания физической копии файла

Боюсь, что нет. Как я сказал выше, StorageFile предназначен для доступа к файловому объекту, если нет доступа к файлу? Полученный вами контент не должен быть файловым объектом, он может быть текстовым или файловым потоком.

Какой вариант лучше - сначала сохраните файл во временной папке, а затем используйте его или создайте класс StorageFile? Зачем?

Создать временный файл, и вы будете иметь StorageFile экземпляр, а затем вы должны быть в состоянии написать принимаемый содержимое файлового потока со стороны StorageFile объекта. Кажется, что создать временный файл в локальной папке - лучший способ, поскольку StorageFile не может быть создан по HTTP-контенту.

Кроме того, доступ к файлам в UWP имеет специальное разрешение, нам, возможно, потребуется обратить внимание, подробнее вы можете обратиться к .

2

Для создания виртуального изображения StorageFile вы можете использовать the StorageFile.CreateStreamedFileAsync method. Вы даете ему имя, делегат и необязательный эскиз. Когда кто-то пытается получить доступ к содержимому виртуального StorageFile, ваш делегат будет вызван, и его задача - заполнить предоставленный выходной поток данными.

Эскиз:

private async Task<StorageFile> ConvertFileAsync(StorageFile originalFile) 
{ 
    var resultBuffer = await PostFileToServiceAndGetResultAsync(originalFile); 

    return 
     await StorageFile.CreateStreamedFileAsync("result.pdf", 
      async (request) => { 
       using (request) 
       { 
        await request.WriteAsync(resultBuffer); 
       } 
      }, null); 
} 

Другой пример можно найти on MSDN.

0

Сохранение его во временное хранилище, вероятно, самое простое, но вы также можете просто реализовать IStorageFile самостоятельно и сохранить загруженный pdf-файл в памяти как переменную в новом классе.