[javascript] JavaScript를 사용하여 파일을 읽고 쓰는 방법?

누구나 JavaScript를 사용하여 파일을 읽고 쓰는 샘플 코드를 줄 수 있습니까?



답변

완벽을 기하기 위해 OP는 브라우저 에서이 작업을 수행하려고한다고 명시하지 않습니다 (말한 것처럼 일반적으로 불가능합니다)

그러나 자바 스크립트 자체가이를 허용합니다. 서버 측 자바 스크립트로 수행 할 수 있습니다.

Javascript File 클래스 에서이 설명서를 참조하십시오.

편집 : 그 링크는 이제 Oracle에 의해 옮겨진 Sun 문서에 대한 링크였습니다.

시간을 지키기 위해 FileSystem 클래스에 대한 node.js 문서가 있습니다. http://nodejs.org/docs/latest/api/fs.html

편집 (2) : HTML5를 사용하여 클라이언트 측에서 파일을 읽을 수 있습니다 : http://www.html5rocks.com/en/tutorials/file/dndfiles/


답변

아니요. 브라우저 측 자바 스크립트는 많은 보안 옵션을 비활성화하지 않고 클라이언트 컴퓨터에 쓸 수있는 권한이 없습니다.


답변

미래가 여기 있습니다! 제안은 완성에 가까워지고 더 이상 ActiveX 또는 플래시 또는 Java가 아닙니다. 이제 우리는 사용할 수 있습니다 :

끌어서 놓기를 사용하여 파일을 브라우저로 가져 오거나 간단한 업로드 컨트롤을 사용할 수 있습니다. 사용자가 파일을 선택하면 Javascript를 통해 읽을 수 있습니다. http://www.html5rocks.com/en/tutorials/file/dndfiles/


답변

다음은 모질라 제안입니다

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

이것은 Spidermonkey와 Adobe의 extendscript에서 컴파일 스위치로 구현됩니다. 또한 Firefox 확장자로 File 객체를 얻습니다.

코뿔소에는 (소설적인) readFile 기능이 있습니다
https://developer.mozilla.org/en/Rhino_Shell

rhino에서보다 복잡한 파일 조작을 위해 java.io.File 메소드를 사용할 수 있습니다.

당신은 브라우저 에서이 물건을 얻지 못할 것입니다. 브라우저에서 유사한 기능을 수행하려면 HTML5, 클라이언트 측 지속성, 쿠키 및 플래시 스토리지 오브젝트의 SQL 데이터베이스 기능을 사용할 수 있습니다.


답변

이 Javascript 기능은 브라우저를 통해이를 실행하는 사용자에게 완전한 “다른 이름으로 저장”대화 상자를 제공합니다. 사용자가 OK를 누르면 파일이 저장됩니다.

편집 : 다음 코드는 Firefox 및 Chrome 에서이 코드를 보안 문제로 간주하여 작동하지 못하도록 IE 브라우저에서만 작동합니다.

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


답변

JScript (Microsoft의 Javascript)를 사용하여 WSH (브라우저가 아님)를 사용하여 로컬 스크립팅을 수행하는 Scripting.FileSystemObject경우 파일 시스템에 액세스 할 수 있습니다 .

많은 보안 설정을 끄면 IE에서 동일한 객체에 액세스 할 수 있다고 생각하지만 이는 매우 나쁜 생각입니다.

여기 MSDN


답변

현재 File , FileWriterFileSystem 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){}
});

원시 파일, 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);

바로 당신이 뭘 바랐나요? 그럴 수도 있고 아닐 수도 있고. 후자의 두 API :

  • 현재 Chromium 기반 브라우저 (Chrome & Opera)에서만 구현됩니다.
  • W3C 표준 트랙에서 벗어 났으며 현재로서는 독점 API입니다
  • 향후 구현 브라우저에서 제거 될 수 있음
  • 디스크 에서 파일 생성을 샌드 박스 ( 파일 외부에서 영향을 줄 수있는 위치)로 제한

또한 FileSystem 스펙은 디렉토리 구조가 디스크에 표시되는 방법에 대한 지침을 정의하지 않습니다. 예를 들어 Chromium 기반 브라우저에서 샌드 박스에는 가상 파일 시스템 (브라우저 내에서 액세스 할 때와 동일한 형식으로 디스크에 반드시 존재하지 않아도되는 디렉토리 구조)이 있으며이 디렉토리 내에서 API가 배치됩니다.

따라서 API를 사용하여 시스템에 파일을 쓸 수는 있지만 API없이 파일을 찾는 경우 (FileSystem 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 라이브러리입니다. 이 녀석이 여기에 의해 관리됩니다 :).