Kann jemand einen Beispielcode zum Lesen und Schreiben einer Datei mit JavaScript geben?
Kann jemand einen Beispielcode zum Lesen und Schreiben einer Datei mit JavaScript geben?
Antworten:
Der Vollständigkeit halber gibt das OP nicht an, dass er dies in einem Browser tun möchte (wenn dies der Fall ist, ist dies im Allgemeinen nicht möglich).
Javascript an sich erlaubt dies jedoch; Dies kann mit serverseitigem Javascript erfolgen.
Weitere Informationen finden Sie in dieser Dokumentation zur Javascript-Dateiklasse
Bearbeiten : Dieser Link führte zu den Sun-Dokumenten, die jetzt von Oracle verschoben wurden.
Um mit der Zeit zu gehen, finden Sie hier die Dokumentation zu node.js für die FileSystem-Klasse: http://nodejs.org/docs/latest/api/fs.html
Bearbeiten (2) : Sie können Dateien jetzt clientseitig mit HTML5 lesen: http://www.html5rocks.com/en/tutorials/file/dndfiles/
Nein. Browserseitiges Javascript hat keine Berechtigung zum Schreiben auf den Clientcomputer, ohne dass viele Sicherheitsoptionen deaktiviert werden müssen
This answer is not useful
.
Die Zukunft ist da! Die Vorschläge stehen kurz vor dem Abschluss, nicht mehr ActiveX oder Flash oder Java. Jetzt können wir verwenden:
Sie können die Datei per Drag & Drop in den Browser oder über ein einfaches Upload-Steuerelement übertragen. Sobald der Benutzer eine Datei ausgewählt hat, können Sie diese mit Javascript lesen: http://www.html5rocks.com/en/tutorials/file/dndfiles/
Hier ist der Mozilla-Vorschlag
http://www-archive.mozilla.org/js/js-file-object.html
Dies wird mit einem Kompilierungsschalter in Spidermonkey und auch in Adobe Extendedcript implementiert. Zusätzlich (glaube ich) erhalten Sie das File-Objekt in Firefox-Erweiterungen.
rhino hat eine (eher rudementäre) readFile-Funktion https://developer.mozilla.org/en/Rhino_Shell
Für komplexere Dateioperationen in Rhino können Sie die Methoden java.io.File verwenden.
Sie werden jedoch nichts davon im Browser erhalten. Für ähnliche Funktionen in einem Browser können Sie die SQL-Datenbankfunktionen von HTML5, clientseitige Persistenz, Cookies und Flash-Speicherobjekte verwenden.
Diese Javascript-Funktion bietet dem Benutzer, der dies über den Browser ausführt, ein vollständiges Dialogfeld "Speichern unter". Der Benutzer drückt OK und die Datei wird gespeichert.
Bearbeiten: Der folgende Code funktioniert nur mit dem IE-Browser, da Firefox und Chrome diesen Code als Sicherheitsproblem angesehen und seine Funktion blockiert haben.
// content is the data you'll write to file<br/>
// filename is the filename<br/>
// what I did is use iFrame as a buffer, fill it up with text
function save_content_to_file(content, filename)
{
var dlg = false;
with(document){
ir=createElement('iframe');
ir.id='ifr';
ir.location='about.blank';
ir.style.display='none';
body.appendChild(ir);
with(getElementById('ifr').contentWindow.document){
open("text/plain", "replace");
charset = "utf-8";
write(content);
close();
document.charset = "utf-8";
dlg = execCommand('SaveAs', false, filename+'.txt');
}
body.removeChild(ir);
}
return dlg;
}
Rufen Sie die Funktion auf:
save_content_to_file("Hello", "C:\\test");
Wenn Sie JScript (Microsoft Javascript) verwenden, um lokales Scripting mit WSH durchzuführen (NICHT in einem Browser!), Können Sie Scripting.FileSystemObject
auf das Dateisystem zugreifen.
Ich denke, Sie können auf dasselbe Objekt im IE zugreifen, wenn Sie viele Sicherheitseinstellungen deaktivieren, aber das wäre eine sehr, sehr schlechte Idee.
hta
Anwendung tun und das löst es
Derzeit können Dateien mit den APIs File , FileWriter und FileSystem aus dem Kontext eines Browser-Tabs / -Fensters geschrieben und gelesen werden , obwohl ihre Verwendung einige Einschränkungen aufweist (siehe Ende dieser Antwort).
Aber um Ihre Frage zu beantworten:
Verwenden von BakedGoods *
Datei schreiben:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Datei lesen:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
Verwenden der Rohdatei-, FileWriter- und FileSystem-APIs
Datei schreiben:
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
fileWriter.write(dataBlob);
}
fileEntry.createWriter(write);
}
directoryEntry.getFile(
"testFile",
{create: true, exclusive: true},
createFileWriter
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
Datei lesen:
function onQuotaRequestSuccess(grantedQuota)
{
function getfile(directoryEntry)
{
function readFile(fileEntry)
{
function read(file)
{
var fileReader = new FileReader();
fileReader.onload = function(){var fileData = fileReader.result};
fileReader.readAsText(file);
}
fileEntry.file(read);
}
directoryEntry.getFile(
"testFile",
{create: false},
readFile
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
Genau das, wonach Sie gefragt haben, oder? Vielleicht, vielleicht nicht. Die beiden letztgenannten APIs:
Darüber hinaus definiert die FileSystem-Spezifikation keine Richtlinien dafür, wie Verzeichnisstrukturen auf der Festplatte angezeigt werden sollen. In Chromium-basierten Browsern verfügt die Sandbox beispielsweise über ein virtuelles Dateisystem (eine Verzeichnisstruktur, die nicht unbedingt in derselben Form auf der Festplatte vorhanden ist wie beim Zugriff über den Browser), in der die Verzeichnisse und Dateien mit dem erstellt werden APIs werden platziert.
Obwohl Sie möglicherweise in der Lage sind, Dateien mit den APIs in ein System zu schreiben, kann das Auffinden der Dateien ohne die APIs (also ohne die FileSystem-API) eine nicht triviale Angelegenheit sein.
Wenn Sie mit diesen Problemen / Einschränkungen umgehen können, sind diese APIs so ziemlich die einzige native Möglichkeit, das zu tun, was Sie gefragt haben.
Wenn Sie für nicht native Lösungen offen sind, ermöglicht Silverlight auch Datei-E / A von einem Registerkarten- / Fensterwettbewerb über IsolatedStorage . Zur Nutzung dieser Funktion ist jedoch verwalteter Code erforderlich. Eine Lösung, die das Schreiben eines solchen Codes erfordert, geht über den Rahmen dieser Frage hinaus.
Natürlich liegt eine Lösung, die komplementären verwalteten Code verwendet und nur Javascript zum Schreiben übrig lässt, im Rahmen dieser Frage;):
//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem", "silverlight"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
* BakedGoods ist eine Javascript-Bibliothek, die eine einheitliche Schnittstelle erstellt, über die gemeinsame Speichervorgänge in allen nativen und einigen nicht nativen Speichereinrichtungen ausgeführt werden können. Es wird von diesem Kerl hier gepflegt :).
Für Firefox:
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
Siehe https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O
Für andere sehen Sie sich die TiddlyWiki- App an , um zu sehen, wie es funktioniert.
Im Kontext des Browsers kann Javascript eine benutzerdefinierte Datei LESEN. Weitere Informationen zum Lesen von Dateien mithilfe der Datei-API finden Sie in Eric Bidelmans Blog . Es ist jedoch nicht möglich, dass browserbasiertes Javascript das Dateisystem des lokalen Computers SCHREIBT, ohne einige Sicherheitseinstellungen zu deaktivieren, da es als Sicherheitsbedrohung für jede Website angesehen wird, Ihr lokales Dateisystem willkürlich zu ändern.
Wenn Sie das sagen, gibt es einige Möglichkeiten, dies zu umgehen, je nachdem, was Sie versuchen:
Wenn es sich um Ihre eigene Site handelt, können Sie ein Java-Applet in die Webseite einbetten. Der Besucher muss jedoch Java auf dem lokalen Computer installieren und wird über das Sicherheitsrisiko informiert. Der Besucher muss zulassen, dass das Applet geladen wird. Ein Java-Applet ist wie eine ausführbare Software, die vollständigen Zugriff auf den lokalen Computer hat.
Chrome unterstützt ein Dateisystem, das ein Sandbox-Teil des lokalen Dateisystems ist. Siehe diese Seite für Details. Dies ermöglicht es Ihnen möglicherweise, Dinge vorübergehend lokal zu speichern. Dies wird jedoch von anderen Browsern nicht unterstützt.
Wenn Sie nicht auf den Browser beschränkt sind, verfügt Node.js über eine vollständige Dateisystemschnittstelle. Hier finden Sie die Dokumentation zum Dateisystem . Beachten Sie, dass Node.js nicht nur auf Servern ausgeführt werden kann, sondern auch auf jedem Client-Computer, einschließlich Windows. Der Javascript-Testläufer Karma basiert auf Node.js. Wenn Sie nur in Javascript auf dem lokalen Computer programmieren möchten, ist dies eine Option.
Um eine Datei zu erstellen, versuchen Sie es
function makefile(){
var fso;
var thefile;
fso = new ActiveXObject("Scripting.FileSystemObject");
thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);
thefile.close()
}
Erstellen Sie Ihr Verzeichnis auf dem Laufwerk C, da Windows gegen das Schreiben aus dem Web geschützt ist, z. B. einen Ordner mit dem Namen "tmp" auf dem Laufwerk C.
Sie müssen sich an Flash, Java oder Silverlight wenden. Im Fall von Silverlight sehen Sie sich Isolated Storage an . Dadurch können Sie in Dateien auf Ihrem eigenen Spielplatz auf der Festplatte des Benutzers schreiben. Sie können jedoch nicht außerhalb Ihres Spielplatzes schreiben.
Sie können dies nicht browserübergreifend tun. IE hat Methoden, um "vertrauenswürdigen" Anwendungen zu ermöglichen, ActiveX-Objekte zum Lesen / Schreiben von Dateien zu verwenden, aber das ist es leider.
Wenn Sie Benutzerinformationen speichern möchten, müssen Sie höchstwahrscheinlich Cookies verwenden.
Bei einem ReactJS-Test schreibt der folgende Code erfolgreich eine Datei:
import writeJsonFile from 'write-json-file';
const ans = 42;
writeJsonFile('answer.txt', ans);
const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);
Die Datei wird in das Verzeichnis geschrieben, das die Tests enthält. Wenn Sie also in eine aktuelle JSON-Datei '* .json' schreiben, wird eine Schleife erstellt!
Sie können auf der Clientseite keine Datei-E / A mit Javascript ausführen, da dies ein Sicherheitsrisiko darstellt. Sie müssten sie entweder zum Herunterladen und Ausführen einer Exe veranlassen, oder wenn sich die Datei auf Ihrem Server befindet, verwenden Sie AJAX und eine serverseitige Sprache wie PHP, um die E / A auf der Serverseite auszuführen
Es gibt zwei Möglichkeiten, eine Datei mit JavaScript zu lesen und zu schreiben
Verwenden von JavaScript-Erweiterungen
Verwenden einer Webseite und ActiveX-Objekte
Hier ist eine Schreiblösung für Chrome v52 + (Benutzer muss noch ein Ziel auswählen ...)
Quelle: StreamSaver.js
<!-- load StreamSaver.js before streams polyfill to detect support -->
<script src="StreamSaver.js"></script>
<script src="https://wzrd.in/standalone/web-streams-polyfill@latest"></script>
const writeStream = streamSaver.createWriteStream('filename.txt')
const encoder = new TextEncoder
let data = 'a'.repeat(1024)
let uint8array = encoder.encode(data + "\n\n")
writeStream.write(uint8array) // must be uInt8array
writeStream.close()
Am besten geeignet zum Schreiben großer Datenmengen, die auf der Clientseite generiert wurden.
Ansonsten schlage ich vor, FileSaver.js zum Speichern von Blob / Files zu verwenden