2016-08-09 3 views
0

Я пишу приложение с использованием Windows IoT на малиновом PI. Я хотел бы записать данные на внешний флеш-накопитель, подключенный к одному из USB-портов. Я нашел примеры того, как писать на SD-карту в PI, но SD-карта не будет доступна в конечном продукте.Запись файлов на внешний флеш-накопитель в Windows Universal

Я могу получить имя корневой папки флеш-накопителя, но когда я пытаюсь записать файл на него, я получаю сообщение об отказе в доступе. Если я переключусь на SD-карту, все будет хорошо.

Может ли кто-нибудь указать мне пример, который позволяет получить доступ к внешнему флэш-накопителю?

+0

Некоторых примеры код был бы полезен для устранения неисправностей. – Jackie

ответ

0

По соображениям безопасности, Universal приложений Windows может иметь доступ только к определенным типам файлов на внешних дисках,

  • Музыка
  • Изображение
  • Видео

И вы должны явно объявите его в файле Package.appxmanifest.

  • Music Library
  • Picture Library
  • Видеотека

Вы также можете проверить возможность съемных носителей, а также.

Я не думаю, что у вас есть доступ к общему файловому формату, кроме указанных выше трех типов, иначе вы получите исключение «Отказано в доступе».

Подробнее ... here.

После того, как вы объявили свои возможности, вы можете получить корневую папку для внешнего устройства хранения данных с помощью следующего кода,

var removableDevices = KnownFolders.RemovableDevices; 
var externalDrives = await removableDevices.GetFoldersAsync(); 
var drive0 = externalDrives[0]; 

Затем вы можете использовать методы потока для записи в файл, после кода образцы в here.

Если вы хотите записать данные в общий формат файла, обходным путем является использование доступного формата файла (например, jpg) и запись на него необработанных данных. Ниже приведен пример кода, который проверяется на Raspberry Pi 2 Model B, с Windows IoT 14393, с внешним USB-накопителем, подключенным к USB-порту.

private async void WriteData() 
    { 
     var removableDevices = KnownFolders.RemovableDevices; 
     var externalDrives = await removableDevices.GetFoldersAsync(); 
     var drive0 = externalDrives[0]; 

     var testFolder = await drive0.CreateFolderAsync("Test"); 
     var testFile = await testFolder.CreateFileAsync("Test.jpg"); 

     var byteArray = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; 
     using (var sourceStream = new MemoryStream(byteArray).AsRandomAccessStream()) 
     { 
      using (var destinationStream = (await testFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)) 
      { 
       await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream); 
      } 
     } 
    } 
+0

Это очень понравилось. Мне также удалось создать файл txt, добавив ассоциацию файлов в файл манифеста приложения. Однако он не позволяет csv-файл. –

+0

Я возвращаю комментарий csv-файла. Он также работает для этого типа файла. –

+0

Удивительный, хорошо знать. – Jackie

0

Set Capability в Package.appxmanifest файл

<Capabilities> 
    <Capability Name="internetClient" /> 
    <uap:Capability Name="removableStorage" /> 
    <!--When the device's classId is FF * *, there is a predefined name for the class. 
      You can use the name instead of the class id. 
      There are also other predefined names that correspond to a classId.--> 
    <DeviceCapability Name="usb"> 
     <!--SuperMutt Device--> 
     <Device Id="vidpid:045E 0611"> 
     <!--<wb:Function Type="classId:ff * *"/>--> 
     <Function Type="name:vendorSpecific" /> 
     </Device> 
    </DeviceCapability> 
    </Capabilities> 

private async void btnCopyImages_Click(object sender, RoutedEventArgs e) 
     { 

      // Get the logical root folder for all external storage devices. 
      StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices; 
      // Get the first child folder, which represents the SD card. 
      StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault(); 
      // An SD card is present and the sdCard variable now contains a to reference it. 
      if (sdCard != null) 
      { 
       StorageFile resultfile = await sdCard.CreateFileAsync("foo.png", CreationCollisionOption.GenerateUniqueName); 
       string base64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/4RjqR.....; 
       var bytes = Convert.FromBase64String(base64); 
       await FileIO.WriteBytesAsync(resultfile, bytes); 
     } 
     // No SD card is present. 
      else 
      { 
      } 
} 
Смежные вопросы