Qualcuno può fornire un codice di esempio per leggere e scrivere un file utilizzando JavaScript?
Qualcuno può fornire un codice di esempio per leggere e scrivere un file utilizzando JavaScript?
Risposte:
Per completezza, l'OP non afferma che sta cercando di farlo in un browser (se è, come è stato affermato, generalmente non è possibile)
Tuttavia javascript in sé lo consente; può essere fatto con javascript lato server.
Vedi questa documentazione sulla classe File Javascript
Modifica : quel collegamento era ai documenti Sun che ora sono stati spostati da Oracle.
Per stare al passo con i tempi ecco la documentazione di node.js per la classe FileSystem: http://nodejs.org/docs/latest/api/fs.html
Modifica (2) : ora puoi leggere i file lato client con HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/
No. JavaScript sul lato browser non dispone dell'autorizzazione per scrivere sul computer client senza che molte opzioni di sicurezza debbano essere disabilitate
This answer is not useful
.
Il futuro è qui! Le proposte sono più vicine al completamento, non più ActiveX o Flash o Java. Ora possiamo usare:
È possibile utilizzare il trascinamento per ottenere il file nel browser o un semplice controllo di caricamento. Una volta che l'utente ha selezionato un file, puoi leggerlo con Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/
ecco la proposta mozilla
http://www-archive.mozilla.org/js/js-file-object.html
questo è implementato con un interruttore di compilazione in spidermonkey e anche nel extendscript di Adobe. Inoltre (penso) ottieni l'oggetto File nelle estensioni di firefox.
rhino ha una funzione readFile (piuttosto scortese) https://developer.mozilla.org/en/Rhino_Shell
per operazioni di file più complesse in rhino, è possibile utilizzare i metodi java.io.File.
non avrai nessuna di queste cose nel browser però. Per funzionalità simili in un browser è possibile utilizzare le funzioni del database SQL da HTML5, persistenza lato client, cookie e oggetti di archiviazione flash.
Questa funzione Javascript presenta una finestra di dialogo "Salva con nome" completa per l'utente che lo esegue tramite il browser. L'utente preme OK e il file viene salvato.
Modifica: il seguente codice funziona solo con IE Browser poiché Firefox e Chrome hanno considerato questo codice un problema di sicurezza e lo hanno bloccato.
// 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;
}
Richiamare la funzione:
save_content_to_file("Hello", "C:\\test");
Se si utilizza JScript (Javascript di Microsoft) per eseguire script locali tramite WSH (NON in un browser!) È possibile utilizzare Scripting.FileSystemObject
per accedere al file system.
Penso che puoi accedere allo stesso oggetto in IE se disattivi molte impostazioni di sicurezza, ma sarebbe una pessima idea.
hta
un'applicazione e questo lo risolve
Attualmente, i file possono essere scritti e letti dal contesto di una scheda / finestra del browser con le API File , FileWriter e FileSystem , anche se ci sono avvertenze al loro uso (vedere la coda di questa risposta).
Ma per rispondere alla tua domanda:
Utilizzando BakedGoods *
Scrivi file:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Leggi il file:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
Utilizzo delle API File, FileWriter e FileSystem non elaborate
Scrivi file:
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);
Leggi il file:
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);
Proprio quello che hai chiesto giusto? Forse sì forse no. Le ultime due delle API:
Inoltre, le specifiche del FileSystem non definiscono linee guida su come le strutture di directory devono apparire sul disco. Nei browser basati su Chromium, ad esempio, il sandbox ha un file system virtuale (una struttura di directory che non esiste necessariamente sul disco nella stessa forma che ha quando si accede dall'interno del browser), all'interno del quale le directory e i file creati con il Le API sono posizionate.
Quindi, anche se potresti essere in grado di scrivere file su un sistema con le API, individuare i file senza le API (beh, senza l'API FileSystem) potrebbe essere un affare non banale.
Se riesci a gestire questi problemi / limitazioni, queste API sono praticamente l'unico modo nativo per fare ciò che hai chiesto.
Se sei aperto a soluzioni non native, Silverlight consente anche l'I / O di file da un concorso di tab / window tramite IsolatedStorage . Tuttavia, per utilizzare questa funzione è necessario un codice gestito ; una soluzione che richiede la scrittura di tale codice va oltre lo scopo di questa domanda.
Naturalmente, una soluzione che fa uso di codice gestito complementare, lasciando uno con solo Javascript per scrivere, rientra ampiamente nell'ambito di questa domanda;):
//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 è una libreria Javascript che stabilisce un'interfaccia uniforme che può essere utilizzata per condurre operazioni di archiviazione comuni in tutte le strutture di archiviazione native e in alcune non native. È gestito da questo ragazzo proprio qui:).
Per Firefox:
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
Vedi https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O
Per altri, controlla l' app TiddlyWiki per vedere come funziona.
Nel contesto del browser, Javascript può LEGGERE il file specificato dall'utente. Vedi il blog di Eric Bidelman per i dettagli sulla lettura dei file usando l'API File. Tuttavia, non è possibile per Javascript basato su browser SCRIVERE il file system del computer locale senza disabilitare alcune impostazioni di sicurezza poiché è considerato una minaccia alla sicurezza per qualsiasi sito Web modificare arbitrariamente il file system locale.
Detto questo, ci sono alcuni modi per aggirare il problema a seconda di ciò che stai cercando di fare:
Se è il tuo sito, puoi incorporare un'applet Java nella pagina web. Tuttavia, il visitatore deve installare Java sul computer locale e verrà avvisato del rischio per la sicurezza. Il visitatore deve consentire il caricamento dell'applet. Un'applet Java è come un software eseguibile che ha accesso completo al computer locale.
Chrome supporta un file system che è una porzione sandbox del file system locale. Vedi questa pagina per i dettagli. Ciò consente eventualmente di salvare temporaneamente le cose localmente. Tuttavia, questo non è supportato da altri browser.
Se non sei limitato al browser, Node.js ha un'interfaccia di file system completa. Vedi qui per la documentazione del suo file system . Si noti che Node.js può essere eseguito non solo sui server, ma anche su qualsiasi computer client incluso Windows. Il test runner javascript Karma si basa su Node.js. Se ti piace solo programmare in javascript sul computer locale, questa è un'opzione.
Per creare il file prova
function makefile(){
var fso;
var thefile;
fso = new ActiveXObject("Scripting.FileSystemObject");
thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);
thefile.close()
}
Crea la tua directory nell'unità C perché Windows ha sicurezza contro la scrittura dal web, ad esempio crea una cartella denominata "tmp" nell'unità C.
Dovrai passare a Flash, Java o Silverlight. Nel caso di Silverlight, guarderai a Storage isolato . Ciò ti farà scrivere sui file nel tuo parco giochi sul disco degli utenti. Tuttavia, non ti permetterà di scrivere al di fuori del tuo parco giochi.
Non puoi farlo in nessun modo tra browser. IE ha metodi per abilitare le applicazioni "attendibili" ad usare oggetti ActiveX per leggere / scrivere file, ma sfortunatamente è così.
Se stai cercando di salvare le informazioni dell'utente, molto probabilmente dovrai utilizzare i cookie.
Da un test ReactJS, il codice seguente scrive correttamente un file:
import writeJsonFile from 'write-json-file';
const ans = 42;
writeJsonFile('answer.txt', ans);
const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);
Il file viene scritto nella directory contenente i test, quindi la scrittura in un vero file JSON '* .json' crea un ciclo!
Non è possibile eseguire l'I / O dei file sul lato client utilizzando JavaScript poiché ciò costituirebbe un rischio per la sicurezza. Dovresti farli scaricare ed eseguire un exe, oppure se il file si trova sul tuo server, usa AJAX e un linguaggio lato server come PHP per eseguire l'I / O sul lato server
Esistono due modi per leggere e scrivere un file utilizzando JavaScript
Utilizzo delle estensioni JavaScript
Utilizzo di una pagina Web e oggetti Active X
Ecco la soluzione di scrittura per Chrome v52 + (l'utente deve ancora selezionare un doe di destinazione ...)
fonte: 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()
Ideale per la scrittura di dati di grandi dimensioni generati sul lato client.
Altrimenti, suggerisco di utilizzare FileSaver.js per salvare Blob / File