26

私がやりたいことは、ファイルを読み取り、ファイルを書き込むときにその情報を使用して他の操作を実行できるようにすることです。例えば:

ファイルを読み取り、ファイルを書き込み、同時に MD5 ハッシュ、デジタル署名などを実行します。

fs.readfile と fs.writefile を 1 つの操作として使用して、ファイルを Web サーバーから自分のコンピューターにコピーするだけで済みますが、これらの同じ操作を引き続き行うことはできないと思います。とにかく、物事の間をスキップします。fs.readfile と writefile を使用して、ファイルをコピーする 2 つの別個の関数を作成するにはどうすればよいですか? これが私が取り組んでいることです。はい、答えを求めてこれらのフォーラムを広範に読みました。

var fs = require('fs');



function getData(srcPath) { 
fs.readFile(srcPath, 'utf8', function (err, data) {
        if (err) throw err;
        return data;
        }
    );
}


function writeData(savPath, srcPath) {
        fs.writeFile (savPath, (getData(srcPath)), function(err) {
        if (err) throw err;
            console.log('complete');
        }
    );
}
//getData ('./test/test.txt');
writeData ('./test/test1.txt','./test/test.txt');

JSONファイルにmd5ハッシュなどを添付して、あらゆるタイプのファイルをダウンロードして生のコピーを作成できるようにしたいと考えています。それはおそらく後で問題になるでしょう。

4

3 に答える 3

27

彼のコメントでdandavisが示唆しているように、readFileそれは非同期呼び出しであるため、何もしません。それが何を意味するかについての追加情報については、この回答を確認してください。

要するに、非同期呼び出しは結果が返されるのを決して待ちません。あなたの例では、必要な結果が返されるのをgetData待ちませんreadFile()が、すぐに終了します。非同期呼び出しは通常callbacks、 と の最後のパラメータであるを渡すことによって処理さreadFileれますwriteFile

いずれにせよ、これを行うには 2 つの方法があります。

1.非同期で実行します(これが適切な方法です):

function copyData(savPath, srcPath) {
    fs.readFile(srcPath, 'utf8', function (err, data) {
            if (err) throw err;
            //Do your processing, MD5, send a satellite to the moon, etc.
            fs.writeFile (savPath, data, function(err) {
                if (err) throw err;
                console.log('complete');
            });
        });
}

2.同期的に実行します。コードを大きく変更する必要はありません。 と をそれぞれ置き換えるだけreadFilewriteFile済みますreadFileSync警告: この方法を使用することは、ベスト プラクティスに反するだけでなく、nodejs を使用する目的そのものに反します (もちろん、非常に正当な理由がない限り)。writeFileSync

編集:OPの要求に従って、コールバックを使用するなど、2つのメソッドを分離する1つの可能な方法を次に示します。

function getFileContent(srcPath, callback) { 
    fs.readFile(srcPath, 'utf8', function (err, data) {
        if (err) throw err;
        callback(data);
        }
    );
}

function copyFileContent(savPath, srcPath) { 
    getFileContent(srcPath, function(data) {
        fs.writeFile (savPath, data, function(err) {
            if (err) throw err;
            console.log('complete');
        });
    });
}

このようにして、読み取り部分 ( getFileContent) をコピー部分から分離しています。

于 2013-07-15T02:12:19.500 に答える
0

ノンブロッキングまたは非同期の方法でファイルを読み書きするには、Promise や Async/await などの es6 以降の高度な機能を使用できますが、ポリフィル( https://javascript.info/polyfills ) または読み取り/書き込みが 2 つしかない場合は、call back Hell を使用できます。

function readFiles(){
    fs.readFile('./txt/start.txt', 'utf-8', (err, data1)=>{
        if(err) return console.log(err);
        fs.readFile(`./txt/${data1}.txt`, 'utf-8', (err, data2)=>{
            if(err) return console.log(err);
            fs.readFile('./txt/append.txt', 'utf-8', (err, data3)=>{
                if(err) return console.log(err);
                writeFile('./txt/final.txt', `${data2}\n${data3}`);
            });
        });
    });
}

function writeFile(path, data){
    fs.writeFile(path,data,'utf-8',err=>{
        if(err){
            console.log(err);
        }
    })
}
readFiles();
于 2020-05-14T09:17:53.020 に答える