JavaScriptを使用してファイルを読み書きするためのサンプルコードを誰かに与えることはできますか?
JavaScriptを使用してファイルを読み書きするためのサンプルコードを誰かに与えることはできますか?
回答:
完全を期すために、OPはブラウザーでこれを実行しようとしていることを述べていません(述べられているように、彼がそうである場合、それは一般的に不可能です)
ただし、JavaScript自体はこれを許可します。サーバー側のJavaScriptで実行できます。
Javascript Fileクラスについては、このドキュメントを参照してください
編集:そのリンクは、現在Oracleによって移動されたSunのドキュメントへのリンクでした。
時代に遅れないようにするには、FileSystemクラスのnode.jsのドキュメントをご覧ください。http://nodejs.org/docs/latest/api/fs.html
Edit(2):HTML5を使用してクライアント側でファイルを読み取ることができます:http : //www.html5rocks.com/en/tutorials/file/dndfiles/
いいえ。ブラウザ側のJavaScriptには、多くのセキュリティオプションを無効にする必要がないクライアントマシンへの書き込み権限がありません。
This answer is not useful
です。
未来はここにあります!提案は完成に近づいており、ActiveX、Flash、Javaはありません。これで使用できます:
ドラッグ/ドロップを使用してファイルをブラウザーに取り込むか、単純なアップロードコントロールを使用できます。ユーザーがファイルを選択したら、Javascriptでファイルを読むことができます。http://www.html5rocks.com/en/tutorials/file/dndfiles/
これがモジラの提案です
http://www-archive.mozilla.org/js/js-file-object.html
これは、spidermonkeyのコンパイルスイッチと、adobeの拡張スクリプトで実装されます。さらに(私はそう思います)、Firefox拡張機能でFileオブジェクトを取得します。
rhinoには(かなり基本的な)readFile関数があり ますhttps://developer.mozilla.org/en/Rhino_Shell
rhinoでより複雑なファイル操作を行うには、java.io.Fileメソッドを使用できます。
ただし、ブラウザでこのようなものを取得することはできません。ブラウザで同様の機能を使用するには、HTML5のSQLデータベース関数、クライアント側の永続性、Cookie、およびフラッシュストレージオブジェクトを使用できます。
このJavaScript関数は、ブラウザからこれを実行するユーザーに完全な「名前を付けて保存」ダイアログボックスを表示します。ユーザーが[OK]を押すと、ファイルが保存されます。
編集:次のコードはIEブラウザーでのみ機能します。FirefoxとChromeはこのコードをセキュリティ上の問題と見なしており、機能しないようにブロックしているためです。
// 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;
}
関数を呼び出します。
save_content_to_file("Hello", "C:\\test");
現在、ファイルはFile、FileWriter、およびFileSystem APIを使用してブラウザーのタブ/ウィンドウのコンテキストから読み書きできますが、それらの使用には注意点があります(この回答の末尾を参照)。
しかし、あなたの質問に答えるには:
BakedGoodsの使用*
ファイルを書き込む:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
ファイルを読む:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
未加工のFile、FileWriter、およびFileSystem APIの使用
ファイルを書き込む:
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);
ファイルを読む:
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);
あなたが右に求めたものだけですか?多分そうでないかもしれません。後の2つのAPI:
さらに、FileSystem仕様では、ディレクトリ構造がディスク上にどのように表示されるかについてのガイドラインは定義されていません。たとえば、Chromiumベースのブラウザーでは、サンドボックスには仮想ファイルシステム(必ずしも、ブラウザー内からアクセスした場合と同じ形式でディスク上に存在するわけではないディレクトリ構造)があり、その中にディレクトリとファイルがAPIが配置されます。
そのため、APIを使用してシステムにファイルを書き込むことはできますが、APIなしで(ファイルシステムAPIなしで)ファイルを見つけることは簡単なことではありません。
これらの問題/制限に対処できる場合、これらのAPIは、要求したことを実行するためのほとんどのネイティブな方法です。
非ネイティブソリューションを利用している場合、Silverlightでは、タブ/ウィンドウコンテストからIsolatedStorageを介してファイルI / Oを行うこともできます。ただし、この機能を利用するにはマネージコードが必要です。このようなコードを記述する必要があるソリューションは、この質問の範囲を超えています。
もちろん、補完するマネージコードを利用し、Javascriptのみを記述して残しておくソリューションは、この質問の範囲内です;):
//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は、すべてのネイティブおよび一部の非ネイティブストレージ機能で共通のストレージ操作を実行するために使用できる統一されたインターフェイスを確立するJavascriptライブラリです。それはこの男がここで管理しています:)。
Firefoxの場合:
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_Oを参照してください
他の人は、TiddlyWikiアプリをチェックして、それがどのように機能するかを確認してください。
ブラウザのコンテキストでは、JavaScriptはユーザー指定のファイルを読み取ることができます。File APIを使用してファイルを読み取る方法の詳細については、Eric Bidelmanのブログを参照してください。ただし、ウェブサイトがローカルファイルシステムを勝手に変更することはセキュリティ上の脅威と見なされるため、ブラウザベースのJavascriptが一部のセキュリティ設定を無効にせずにローカルコンピュータのファイルシステムを書き込むことはできません。
それを言って、あなたが何をしようとしているのかに応じてそれを回避するいくつかの方法があります:
自分のサイトであれば、JavaアプレットをWebページに埋め込むことができます。ただし、訪問者はローカルマシンにJavaをインストールする必要があり、セキュリティリスクについて警告されます。訪問者はアプレットのロードを許可する必要があります。Javaアプレットは、ローカルコンピュータに完全にアクセスできる実行可能ソフトウェアのようなものです。
Chromeは、ローカルファイルシステムのサンドボックス化された部分であるファイルシステムをサポートしています。詳細については、このページを参照してください。これにより、ローカルに一時的に保存することができます。ただし、これは他のブラウザではサポートされていません。
ブラウザに限定されていない場合、Node.jsには完全なファイルシステムインターフェースがあります。ファイルシステムのドキュメントについては、こちらを参照してください。Node.jsはサーバーだけでなく、Windowsを含むすべてのクライアントコンピューターでも実行できることに注意してください。JavaScriptテストランナーKarmaはNode.jsに基づいています。ローカルコンピュータのJavaScriptでプログラミングしたい場合は、これはオプションです。
ファイルを作成するには
function makefile(){
var fso;
var thefile;
fso = new ActiveXObject("Scripting.FileSystemObject");
thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);
thefile.close()
}
WindowsはCドライブに「tmp」という名前のフォルダーを作成するなど、Webからの書き込みに対してセキュリティを備えているため、Cドライブにディレクトリを作成します。
Flash、Java、またはSilverlightを使用する必要があります。Silverlightの場合は、分離ストレージを参照します。これにより、ユーザーのディスク上の自分のプレイグラウンドにあるファイルに書き込むことができます。ただし、遊び場の外で書くことはできません。
ReactJSテストから、次のコードはファイルを正常に書き込みます。
import writeJsonFile from 'write-json-file';
const ans = 42;
writeJsonFile('answer.txt', ans);
const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);
ファイルはテストを含むディレクトリに書き込まれるため、実際のJSONファイル「* .json」に書き込むとループが作成されます。
セキュリティ上のリスクがあるため、JavaScriptを使用してクライアント側でファイルI / Oを実行することはできません。exeをダウンロードして実行するように依頼するか、ファイルがサーバー上にある場合は、AJAXとPHPなどのサーバー側言語を使用してサーバー側でI / Oを実行する必要があります。
これがchrome v52 +の書き込みソリューションです(ユーザーはまだ宛先doeを選択する必要があります...)
ソース: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()
クライアント側で生成された大きなデータを書き込むのに最適です。
それ以外の場合は、FileSaver.jsを使用してBlob /ファイルを保存することをお勧めします