2016-08-09 1 views
0

Ich schreibe eine Anwendung mit Windows IoT auf einem Raspberry PI. Ich möchte Daten auf ein externes Flash-Laufwerk schreiben, das an einen der USB-Anschlüsse angeschlossen ist. Ich habe Beispiele dafür gefunden, wie man auf die SD-Karte im PI schreibt, aber die SD-Karte ist im fertigen Produkt nicht zugänglich.Schreiben von Dateien auf externen Flash-Laufwerk in Windows Universal

Ich kann den Namen des Stammordners des Flash-Laufwerks abrufen, aber wenn ich versuche, eine Datei zu schreiben, erhalte ich eine Meldung über den Zugriff verweigert. Wenn ich auf die SD-Karte umschalte, funktioniert alles einwandfrei.

Kann mir jemand auf ein Beispiel verweisen, das den Zugriff auf ein externes Flash-Laufwerk ermöglicht?

+0

Einige Codebeispiel wäre hilfreich für die Problembehandlung. – Jackie

Antwort

0

Aus Sicherheitsgründen, Universal Windows-Anwendungen nur den Zugriff auf bestimmte Arten von Dateien auf externen Laufwerken haben,

  • Musik
  • Bild
  • Video

Und Sie haben ausdrücklich auf Deklarieren Sie es in der Package.appxmanifest-Datei.

  • Musikbibliothek
  • Picture Library
  • Video Library

Sie mögen vielleicht auch als auch die Wechselfähigkeit überprüfen.

Ich glaube nicht, dass Sie Zugriff auf ein allgemeines Dateiformat mit Ausnahme der oben genannten drei Typen haben, sonst erhalten Sie eine Ausnahme "Zugriff verweigert".

Weitere Details finden Sie unter here.

Sobald Sie Ihre Fähigkeiten erklären, können Sie den Stammordner für Ihr externes Speichergerät mit dem folgenden Code erhalten,

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

Dann können Sie die Stream-Methoden verwenden, um eine Datei zu schreiben, nach dem Code Proben in here.

Wenn Sie Daten in ein generisches Dateiformat schreiben möchten, können Sie ein barrierefreies Dateiformat (wie jpg) verwenden und Ihre Rohdaten dorthin schreiben. Unten finden Sie ein Codebeispiel, das auf dem Raspberry Pi 2 Modell B mit Windows IoT 14393 verifiziert ist, wobei ein externes USB-Laufwerk an den USB-Anschluss angeschlossen ist.

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

Das hat super funktioniert, danke. Ich konnte auch eine TXT-Datei erstellen, indem ich eine Dateizuordnung in der App-Manifest-Datei hinzufüge. Es erlaubt jedoch keine CSV-Datei. –

+0

Ich nehme den CSV-Dateikommentar zurück. Es funktioniert auch für diesen Dateityp. –

+0

Super, gut zu wissen. – Jackie

0

Set-Fähigkeit in Package.appxmanifest Datei

<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 
      { 
      } 
} 
Verwandte Themen