Schnellstart: Senden von Dateien an ein Speichergerät (HTML)
[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]
In diesem Lernprogramm wird dargestellt, wie Sie eine Datei auf ein Wechselspeichergerät kopieren, indem Sie mit Windows.Devices.Portable.Storage.FromId ein Speicherobjekt instanziieren.
Ziel: Erfahren Sie, wie Sie die Windows.Devices.Enumeration-API zum Aufzählen von Wechselspeichergeräten verwenden und ein Gerät auswählen, um es zum Instanziieren eines Speicherobjekts zu verwenden, das anschließend als Ziel für einen copyAsync-Vorgang dienen kann.
Voraussetzungen
Sie sollten mit JavaScript und HTML vertraut sein.
Sie benötigen ein verfügbares Wechselspeichergerät.
Zeitaufwand: 20 Minuten.
Anweisungen
1. Öffnen von Microsoft Visual Studio
Öffnen Sie eine Instanz von Visual Studio.
2. Erstellen eines neuen Projekts
Wählen Sie im Dialogfeld Neues Projekt in den JavaScript-Projekttypen die Option für eine leere App aus.
3. Deklarieren der Funktion "Wechselspeichergeräte"
Doppelklicken Sie im Projektmappen-Explorer auf die Datei package.appxmanifest. Klicken Sie auf die Registerkarte Capabilities. Aktivieren Sie in der Liste Funktionen die Option Wechselspeichergeräte.
4. Einfügen des JavaScript- und HTML-Codes in die App
Öffnen Sie die Datei "Default.html", und kopieren Sie den folgenden HTML-Code in die Datei, sodass der Originalinhalt ersetzt wird.
<!DOCTYPE html>
<html>
<head>
<title>Removable Storage Devices</title>
<link rel="stylesheet" href="/winjs/css/ui-dark.css" />
<script type = "text/javascript" >
Enum = Windows.Devices.Enumeration;
// Enumerate removable storage devices.
// The success callback selects the removable storage to use.
function pickStorage(){
Enum.DeviceInformation.findAllAsync(
Windows.Devices.Portable.StorageDevice.getDeviceSelector(),
null).then(
successCallback,
errorCallback);
}
// Handler that's called when removable storages are found.
// The storageDevices parameter is of type
// Windows.Devices.Enumeration.DeviceInformationCollection
function successCallback(storageDevices){
var removableStorage;
if (storageDevices.length) {
try {
// Create an IStorageItem from the first removable storage device
removableStorage = Windows.Devices.Portable.StorageDevice.fromId(
storageDevices.getAt(0).id);
} catch (e) {
document.getElementById("output").innerHTML =
"Error creating storage item: " + e.message;
}
if (removableStorage != null) {
PickAndSend(removableStorage, removableStorage.name);
}
}
}
function errorCallback(e) {
document.getElementById("output").innerHTML = "Error: " + e.message;
}
// Pick a file, and send it to the removable storage device
// removableStorage: The IStorageItem representing the storage device
// removableStorageName: The name of the storage device
function PickAndSend(removableStorage, removableStorageName) {
// Create the picker for selecting an image file
var picker = new Windows.Storage.Pickers.FileOpenPicker();
// Set the collection of types that the file open picker displays.
picker.fileTypeFilter.replaceAll([".jpg", ".png", ".gif"]);
// Set the initial location where the file picker looks
picker.suggestedStartLocation =
Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
picker.pickSingleFileAsync().then(
function (sourceFile) {
// sourceFile is null if the user
// clicked cancel from the picker
if (sourceFile == null) {
document.getElementById("output").innerHTML =
"No file was picked.";
}
else {
// Copy the file to the storage device
// using StorageFile.copyAsync
sourceFile.copyAsync(removableStorage).then(
function (newFile) {
document.getElementById("output").innerHTML =
"Created file: " + newFile.name + " on " +
removableStorageName + "<br/>";
},
function (e) {
// A failure here could mean that the removable storage
// does not allow file creation on its root.
// We try to find a folder to copy the file to.
copyToFirstAvailableFolder(
removableStorage, sourceFile);
}); // end sourceFile.copyAsync
} // end if (sourceFile)
}); // end pickSingleFileAsync.then
}
function copyToFirstAvailableFolder(removableStorage, sourceFile) {
// Construct a recursive folder search
var queryOptions = new Windows.Storage.Search.QueryOptions(
Windows.Storage.Search.CommonFolderQuery.defaultQuery);
queryOptions.folderDepth = Windows.Storage.Search.FolderDepth.deep;
var deepFolderQuery =
removableStorage.createFolderQueryWithOptions(queryOptions);
deepFolderQuery.getFoldersAsync().then(
function (folders) {
copyToFolder(folders, 0, sourceFile);
},
function (e) {
document.getElementById("output").innerHTML =
"Failed to find any folders to copy to: " + e.message;
});
}
function copyToFolder(folderList, currentIndex, sourceFile) {
if (currentIndex === folderList.length) {
document.getElementById("output").innerHTML =
"Failed to find a writable folder to copy to";
return;
}
var destinationFolder = folderList[currentIndex];
document.getElementById("output").innerHTML =
"Trying folder: " + destinationFolder.name + "...";
performCopyToDevice(
destinationFolder,
sourceFile,
function (newFile) {
document.getElementById("output").innerHTML += "Created file: " +
newFile.name + " in folder: " + destinationFolder.name + "<br/>";
},
function (e) {
copyToFolder(folderList, currentIndex + 1, sourceFile);
});
}
function performCopyToDevice(
destinationFolder, sourceFile, completedHandler, errorHandler) {
if (itemInFileSystemStorage(destinationFolder)) {
sourceFile.copyAsync(destinationFolder).then(
completedHandler, errorHandler);
} else {
// Use createFile/stream copy for non-file-system-based storages
var destOutputStream = null;
var newFile = null;
return destinationFolder.createFileAsync(sourceFile.fileName).
then(
function (file) {
newFile = file;
return newFile.openAsync(
Windows.Storage.FileAccessMode.readWrite);
},
errorHandler).
then(
function (destStream) {
destOutputStream = destStream.getOutputStreamAt(0);
return sourceFile.openForReadAsync();
},
errorHandler).
then(
function (sourceInputStream) {
Windows.Storage.Streams.RandomAccessStream.copy(
sourceInputStream, destOutputStream);
return destOutputStream.flushAsync();
},
errorHandler).
then(
function () {
completedHandler(newFile);
},
errorHandler);
}
}
function itemInFileSystemStorage(item) {
// Items in file-system-backed storages have a non-zero-length path
return (item.path.length > 0);
}
</script>
</head>
<body>
<p>
Click "Send File" <br /> </p>
<input type="button" onclick="pickStorage()"
value="Pick and Send File to Storage" /><br />
<div id=output></div>
</body>
</html>
5. Testen der Anwendung
- Schließen Sie das Wechselspeichergerät an, wenn es noch nicht angeschlossen ist.
- Klicken Sie im Menü Debuggen auf Debugging starten, um die Projektmappe zu testen.
- Klicken Sie auf die Schaltfläche Pick and Send File to Storage, um eine Datei mithilfe von FilePicker auszuwählen und die Datei auf das Wechselspeichergerät zu kopieren.
Hinweis Prüfen Sie Folgendes, wenn Sie einen Fehler erhalten:
- Vergewissern Sie sich, dass Sie Zugriff auf Wechselmedien haben, indem Sie im Projektmappen-Explorer die Datei package.appxmanifest öffnen und die Option Wechselmedien auf der Registerkarte Funktionen überprüfen.
Zusammenfassung
Sie haben erfahren, wie Sie lokale Dateien auf ein Wechselspeichergerät kopieren. Im nächsten Lernprogramm erfahren Sie, wie Sie eine Bilddatei von einem Wechselspeichergerät abrufen und diese anzeigen.