ค้นหาเว็บไซต์

วิธีการอ่านและเขียนไฟล์โดยใช้ JavaScript?


ใครสามารถให้ตัวอย่างโค้ดสำหรับการอ่านและเขียนไฟล์โดยใช้ JavaScript ได้บ้าง?

คำตอบ #1

เพื่อความสมบูรณ์ ผู้ตั้งกระทู้ไม่ได้ระบุว่าเขากำลังมองหาที่จะทำสิ่งนี้บนเบราว์เซอร์ (ถ้าเขากำลังทำ ตามที่ได้กล่าวไว้ โดยทั่วไปแล้วเป็นไปไม่ได้)

อย่างไรก็ตาม JavaScript โดยตัวมันเองอนุญาตสิ่งนี้; สามารถทำได้ด้วย JavaScript ฝั่งเซิร์ฟเวอร์

ดูเอกสารเกี่ยวกับคลาสไฟล์ของ Javascript นี้

แก้ไข: ลิงก์นั้นเป็นลิงก์ไปยังเอกสารของ Sun ที่ตอนนี้ถูก Oracle ย้ายไปแล้ว

เพื่อติดตามยุคสมัย นี่คือเอกสาร node.js สำหรับคลาส FileSystem: http://nodejs.org/docs/latest/api/fs.html

แก้ไข(2): ตอนนี้คุณสามารถอ่านไฟล์ฝั่งไคลเอนต์ด้วย HTML5 ได้แล้ว: http://www.html5rocks.com/en/tutorials/file/dndfiles/

คำตอบ #2

ไม่ใช่ JavaScript ฝั่งเบราว์เซอร์ไม่มีสิทธิ์ในการเขียนลงเครื่องลูกข่ายโดยไม่ต้องปิดการตั้งค่าด้านความปลอดภัยหลายอย่าง

คำตอบ #3

อนาคตมาถึงแล้ว! ข้อเสนอต่าง ๆ ใกล้ความสำเร็จมากขึ้น ไม่มี ActiveX หรือแฟลชหรือจาวาอีกต่อไป ตอนนี้เราสามารถใช้:

  • API ของระบบแฟ้ม

  • การเข้าถึงไฟล์แบบลากและวางพื้นเมือง

คุณสามารถใช้การลาก/วางเพื่อเอาไฟล์เข้ามาในเบราว์เซอร์ หรือใช้ตัวควบคุมการอัปโหลดแบบง่าย เมื่อผู้ใช้เลือกไฟล์แล้ว คุณสามารถอ่านไฟล์นั้นด้วย Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/

คำตอบ #4

นี่คือข้อเสนอของมอซิลลา

http://www-archive.mozilla.org/js/js-file-object.html

นี่ถูกดำเนินการโดยใช้สวิตช์การคอมไพล์ใน spidermonkey และยังใน adobe's extendscript นอกจากนี้ (ผมคิดว่า) คุณจะได้วัตถุ File ในส่วนขยายของ firefox

rhino มีฟังก์ชัน readFile (ค่อนข้างพื้นฐาน) https://developer.mozilla.org/en/Rhino_Shell

สำหรับการดำเนินการไฟล์ที่ซับซ้อนมากขึ้นใน Rhino คุณสามารถใช้เมธอดของ java.io.File ได้

คุณจะไม่ได้รับสิ่งเหล่านี้ในเบราว์เซอร์ อย่างไรก็ตาม สำหรับฟังก์ชันที่คล้ายกันในเบราว์เซอร์ คุณสามารถใช้ฟังก์ชันฐานข้อมูล SQL จาก HTML5 การเก็บข้อมูลฝั่งลูกค้า คุกกี้ และวัตถุเก็บข้อมูลแฟลช

คำตอบ #5

ฟังก์ชัน Javascript นี้แสดงกล่องโต้ตอบ "บันทึกเป็น" แบบสมบูรณ์ให้กับผู้ใช้ที่เรียกใช้นี้ผ่านเบราว์เซอร์ ผู้ใช้กดตกลงและไฟล์จะถูกบันทึก

แก้ไข: โค้ดต่อไปนี้สามารถใช้งานได้เฉพาะกับเบราว์เซอร์ 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");

คำตอบ #6

ปัจจุบัน ไฟล์สามารถเขียนและอ่านจากบริบทของแท็บ/หน้าต่างเบราว์เซอร์ด้วย API ของ File, FileWriter และ FileSystem ได้ แม้ว่าจะมีข้อควรระวังในการใช้งานของพวกมัน (ดูส่วนท้ายของคำตอบนี้)

แต่เพื่อตอบคำถามของคุณ:

การใช้ขนมอบ*

เขียนไฟล์:

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){}
});

การใช้ API ของไฟล์ดิบ, FileWriter, และ FileSystem

เขียนไฟล์:

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);

นี่แหละสิ่งที่คุณขอใช่ไหม? บางที บางทีไม่ใช่ สองตัวหลังของ API:

  • ปัจจุบันสามารถใช้งานได้เฉพาะในเบราว์เซอร์ที่ใช้ Chromium (Chrome & Opera)
  • ได้ถูกนำออกจากเส้นทางมาตรฐานของ W3C และ ณ ตอนนี้เป็น API ที่เป็นกรรมสิทธิ์
  • อาจถูกลบออกจากเบราว์เซอร์ที่ใช้งานในอนาคต
  • จำกัดการสร้างไฟล์ให้อยู่ใน sandbox (ตำแหน่งที่อยู่นอกนั้นไฟล์จะไม่สามารถสร้างผลใด ๆ ได้) บนดิสก์

นอกจากนี้ สเปกของ FileSystem ไม่ได้กำหนดแนวทางใด ๆ เกี่ยวกับการปรากฏตัวของโครงสร้างไดเรกทอรีบนดิสก์ ตัวอย่างเช่น ในเบราว์เซอร์ที่ใช้ Chromium sandbox จะมี ระบบไฟล์เสมือน (โครงสร้างไดเรกทอรีที่อาจไม่ปรากฏอยู่บนดิสก์ในรูปแบบเดียวกับที่เห็นเมื่อต้องเข้าถึงจากภายในเบราว์เซอร์) ซึ่งภายในนั้น ไดเรกทอรีและไฟล์ที่สร้างขึ้นด้วย API จะถูกวางไว้

ดังนั้นแม้ว่าคุณอาจสามารถเขียนไฟล์ไปยังระบบด้วย API เหล่านี้ การหาตำแหน่งไฟล์โดยไม่มี API (เอ่อ โดยไม่ใช้ FileSystem API) อาจเป็นเรื่องที่ไม่ง่าย

ถ้าคุณสามารถจัดการกับปัญหา/ข้อจำกัดเหล่านี้ได้ APIs เหล่านี้ก็แทบจะเป็นวิธีดั้งเดิมเพียงวิธีเดียวในการทำสิ่งที่คุณขอ

หากคุณเปิดรับวิธีแก้ปัญหาแบบไม่ใช่เนทีฟ Silverlight ยังอนุญาตให้ทำการอ่าน/เขียนไฟล์จากแท็บ/หน้าต่างผ่าน IsolatedStorage อย่างไรก็ตาม จำเป็นต้องใช้โค้ดที่จัดการเพื่อใช้ฟังก์ชันนี้; วิธีแก้ปัญหาที่ต้องเขียนโค้ดเช่นนี้อยู่นอกเหนือขอบเขตของคำถามนี้

แน่นอน วิธีแก้ปัญหาที่ใช้โค้ดจัดการเสริม ทำให้เหลือเพียงแค่การเขียน 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 ที่สร้างอินเทอร์เฟซแบบเดียวกันซึ่งสามารถใช้ดำเนินการเก็บข้อมูลทั่วไปในทุกพื้นที่เก็บข้อมูลพื้นเมือง และบางพื้นที่เก็บข้อมูลที่ไม่ใช่พื้นเมือง มันได้รับการดูแลโดยผู้ชายคนนี้ที่นี่ : ) .

คำตอบ #7

หากคุณกำลังใช้ JScript (Javascript ของ Microsoft) เพื่อทำสคริปต์ในเครื่องโดยใช้ WSH (ไม่ใช่ในเบราว์เซอร์!) คุณสามารถใช้ Scripting.FileSystemObject เพื่อเข้าถึงระบบไฟล์ได้

ฉันคิดว่าคุณสามารถเข้าถึงวัตถุเดียวกันนั้นใน IE ได้ถ้าคุณปิดการตั้งค่าความปลอดภัยหลายอย่าง แต่สิ่งนั้นจะเป็นความคิดที่ไม่ดีมากๆ

MSDN ที่นี่

บทความที่เกี่ยวข้อง