Node.js에서 파일 읽기


186

Node.js에서 파일을 읽는 것에 상당히 당황합니다.

fs.open('./start.html', 'r', function(err, fileToRead){
    if (!err){
        fs.readFile(fileToRead, {encoding: 'utf-8'}, function(err,data){
            if (!err){
            console.log('received data: ' + data);
            response.writeHead(200, {'Content-Type': 'text/html'});
            response.write(data);
            response.end();
            }else{
                console.log(err);
            }
        });
    }else{
        console.log(err);
    }
});

파일 start.html이 열려고하는 파일과 동일한 디렉토리에 있습니다.

그러나 콘솔에서 나는 얻는다 :

{[오류 : ENOENT, './start.html'열기] 오류 : 34, 코드 : 'ENOENT', 경로 : './start.html'}

어떤 아이디어?


8
파일이 사용자 / 코드가 생각하는 위치가 아닐 수 있습니다. 파일이 스크립트와 동일한 디렉토리에 있으면 다음을 시도하십시오.path.join(__dirname, 'start.html')
— dc5

1
console.log ( "__ dirname :"+ __dirname); err을 출력하기 직전에? 그 시점에서 실행 파일에 대해 어떤 디렉토리가 로컬인지 알려줍니다. 위치를 변경하기 위해 할 수있는 일이 있으며 아마도 당신이 생각하는 __dirname에서 코드가 작동하지 않을 수 있습니다.
— Brian

파일은 노드 프로세스를 실행하는 디렉토리와 동일한 디렉토리에 있어야합니다. 따라서 파일이 dir / node / index.html에 있고 app.js 파일에도 있지만 다음과 같이 수행하면 node /dir/node/app.js 오류가 발생합니다. dc5의 솔루션이 트릭을 수행해야합니다.
— Evan Shortiss

이 질문을 닫거나 수정 사항을 답변으로 제공하고 수락해야합니다.
— ChrisCM

사용 path.join(__dirname, '/filename.html')및에서 참조 걸릴 stackoverflow.com/a/56110874/4701635
— Paresh 바라

답변:


237

사용 path.join(__dirname, '/start.html');

var fs = require('fs'),
    path = require('path'),    
    filePath = path.join(__dirname, 'start.html');

fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
    if (!err) {
        console.log('received data: ' + data);
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write(data);
        response.end();
    } else {
        console.log(err);
    }
});

dc5 덕분입니다.


14
@AramKocharyan 비동기 코드에서 * 동기화 기능을 사용하지 마십시오. 파일을 읽을 때까지 전체 앱을 잠급니다. * 동기화 기능은 앱 시작시 (예 : 모듈 시스템)에 사용되도록 설계되었습니다.
— Eugene Kostrikov 2016 년

3
예, 제 경우에는 지루한 작업이었습니다.
— Aram Kocharyan 2016 년

2
코드 샘플에 오타가 path.join있습니다. ,대신 쓸모가 없습니다.+
— Yves M.

이 코드는 저에게
— 효과적

../someFolder/myFile.txt? 와 같은 일반 문자열 경로를 사용하여 작동하지 않는 이유는 무엇 입니까?
— Miguel Péres 2012

42

Node 0.12를 사용하면 이제 동 기적으로이 작업을 수행 할 수 있습니다.

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../public/mydata.png');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fs파일 시스템입니다. readFileSync () 는 버퍼 또는 요청하면 문자열을 반환합니다.

fs상대 경로가 보안 문제라고 올바르게 가정합니다. path해결 방법입니다.

문자열로로드하려면 인코딩을 지정하십시오.

return fs.readFileSync(path,{ encoding: 'utf8' });

5
*Sync웹 프로그래밍시 어떤 방법도 사용하지 마십시오 . 이러한 작업은 grunt / gulp 작업, 콘솔 응용 프로그램에만 적합합니다. 읽는 동안 전체 프로세스를 일시 중지합니다. OP의 코드가 참조 response되므로 readFileSync적절하지 않은 웹 응용 프로그램 입니다.
— 사무엘 네프

3
다른 유스 케이스가 있는지 여부에 관계없이 (시작시 캐시에 파일을로드하는 것은 분명히 그중 하나가 아닙니다) OP의 포스트는 확실히 사용하려는 경우가 아닙니다. readFileSync그는 처리 중입니다. 웹 요청. 이 답변은 당면한 질문에 완전히 부적절했습니다.
— 사무엘 네프

28

1). ASync의 경우 :

var fs = require('fs');
fs.readFile(process.cwd()+"\\text.txt", function(err,data)
            {
                if(err)
                    console.log(err)
                else
                    console.log(data.toString());
            });

2). 동기화 :

var fs = require('fs');
var path = process.cwd();
var buffer = fs.readFileSync(path + "\\text.txt");
console.log(buffer.toString());

3
대신 process.cwd ()의 난 당신이 __dirname 변수를 사용할 수 있다고 생각
— 이시카와 요시

2
@IshikawaYoshi process.cwd()는 현재 작업 디렉토리이며 __dirname현재 모듈의 디렉토리이므로 동일하지 않습니다.
— A1rPun

13

노드와 간단한 동기 방식 :

let fs = require('fs')

let filename = "your-file.something"

let content = fs.readFileSync(process.cwd() + "/" + filename).toString()

console.log(content)

9

이 코드를 실행하면 파일에서 데이터를 가져 와서 콘솔에 표시합니다

function fileread(filename)
{            
   var contents= fs.readFileSync(filename);
   return contents;
}        
var fs =require("fs");  // file system        
var data= fileread("abc.txt");
//module.exports.say =say;
//data.say();
console.log(data.toString());

5

http모듈을 사용하여 서버에서 HTML 파일을 읽습니다 . 이것은 서버에서 파일을 읽는 한 가지 방법입니다. 콘솔에서 가져 오려면 http모듈 선언을 제거하십시오 .

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
  fs.readFile('HTMLPage1.html', function(err, data) {
    if (!err) {
      res.writeHead(200, {
        'Content-Type': 'text/html'
      });
      res.write(data);
      res.end();
    } else {
      console.log('error');
    }
  });
});
server.listen(8000, function(req, res) {
  console.log('server listening to localhost 8000');
});
<html>

<body>
  <h1>My Header</h1>
  <p>My paragraph.</p>
</body>

</html>


위의 코드는 서버에서 html 파일을 읽는 것입니다. "http"모듈을 사용하여 서버를 작성하여 서버에서 html 파일을 읽을 수 있습니다. 서버에서 파일을 응답하는 방법입니다. 콘솔에 설치하기 위해 "http"모듈을 제거 할 수도 있습니다
— Aaditya

1
이 페이지에서 편집 버튼을 클릭하여 답변에 의견을 포함시킬 수 있습니다.
— Glenn Watson

3

디렉토리 내에서 파일을 읽고 파일로 무언가를 수행하는 방법을 알고 싶다면 여기로 가십시오. 또한를 통해 명령을 실행하는 방법을 보여줍니다 power shell. 이 안에 있습니다 TypeScript! 나는 이것에 문제가 있었기 때문에 언젠가 누군가에게 도움이되기를 바랍니다. 도움이되지 않는다고 생각되면 자유롭게 투표하십시오. 이것이 나를 위해 한 것은 배포 준비를 위해 특정 폴더 내의 각 디렉토리에있는 webpack모든 .ts파일이었습니다. 당신이 그것을 사용할 수 있기를 바랍니다!

import * as fs from 'fs';
let path = require('path');
let pathDir = '/path/to/myFolder';
const execSync = require('child_process').execSync;

let readInsideSrc = (error: any, files: any, fromPath: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach((file: any, index: any) => {
        if (file.endsWith('.ts')) {
            //set the path and read the webpack.config.js file as text, replace path
            let config = fs.readFileSync('myFile.js', 'utf8');
            let fileName = file.replace('.ts', '');
            let replacedConfig = config.replace(/__placeholder/g, fileName);

            //write the changes to the file
            fs.writeFileSync('myFile.js', replacedConfig);

            //run the commands wanted
            const output = execSync('npm run scriptName', { encoding: 'utf-8' });
            console.log('OUTPUT:\n', output);

            //rewrite the original file back
            fs.writeFileSync('myFile.js', config);
        }
    });
};

// loop through all files in 'path'
let passToTest = (error: any, files: any) => {
    if (error) {
        console.error('Could not list the directory.', error);
        process.exit(1);
    }

    files.forEach(function (file: any, index: any) {
        let fromPath = path.join(pathDir, file);
        fs.stat(fromPath, function (error2: any, stat: any) {
            if (error2) {
                console.error('Error stating file.', error2);
                return;
            }

            if (stat.isDirectory()) {
                fs.readdir(fromPath, (error3: any, files1: any) => {
                    readInsideSrc(error3, files1, fromPath);
                });
            } else if (stat.isFile()) {
                //do nothing yet
            }

        });
    });
};

//run the bootstrap
fs.readdir(pathDir, passToTest);

2
var fs = require('fs');
var path = require('path');

exports.testDir = path.dirname(__filename);
exports.fixturesDir = path.join(exports.testDir, 'fixtures');
exports.libDir = path.join(exports.testDir, '../lib');
exports.tmpDir = path.join(exports.testDir, 'tmp');
exports.PORT = +process.env.NODE_COMMON_PORT || 12346;

// Read File
fs.readFile(exports.tmpDir+'/start.html', 'utf-8', function(err, content) {
  if (err) {
    got_error = true;
  } else {
    console.log('cat returned some content: ' + content);
    console.log('this shouldn\'t happen as the file doesn\'t exist...');
    //assert.equal(true, false);
  }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.