我试图遍历并拾取目录中的文件,但是在实现它时遇到了一些麻烦。如何提取多个文件,然后将它们移动到另一个文件夹?
var dirname = 'C:/FolderwithFiles'; console.log("Going to get file info!"); fs.stat(dirname, function (err, stats) { if (err) { return console.error(err); } console.log(stats); console.log("Got file info successfully!"); // Check file type console.log("isFile ? " + stats.isFile()); console.log("isDirectory ? " + stats.isDirectory()); });
您想要使用fs.readdir函数获取目录内容,并使用fs.rename函数实际执行重命名。如果您 需要 等待它们完成之后再运行代码,则这两个函数都具有同步版本。
我写了一个快速脚本来完成您所描述的。
var fs = require('fs'); var path = require('path'); // In newer Node.js versions where process is already global this isn't necessary. var process = require("process"); var moveFrom = "/home/mike/dev/node/sonar/moveme"; var moveTo = "/home/mike/dev/node/sonar/tome" // Loop through all the files in the temp directory fs.readdir(moveFrom, function (err, files) { if (err) { console.error("Could not list the directory.", err); process.exit(1); } files.forEach(function (file, index) { // Make one pass and make the file complete var fromPath = path.join(moveFrom, file); var toPath = path.join(moveTo, file); fs.stat(fromPath, function (error, stat) { if (error) { console.error("Error stating file.", error); return; } if (stat.isFile()) console.log("'%s' is a file.", fromPath); else if (stat.isDirectory()) console.log("'%s' is a directory.", fromPath); fs.rename(fromPath, toPath, function (error) { if (error) { console.error("File moving error.", error); } else { console.log("Moved file '%s' to '%s'.", fromPath, toPath); } }); }); }); });
在我的本地机器上测试。
node testme.js '/home/mike/dev/node/sonar/moveme/hello' is a file. '/home/mike/dev/node/sonar/moveme/test' is a directory. '/home/mike/dev/node/sonar/moveme/test2' is a directory. '/home/mike/dev/node/sonar/moveme/test23' is a directory. '/home/mike/dev/node/sonar/moveme/test234' is a directory. Moved file '/home/mike/dev/node/sonar/moveme/hello' to '/home/mike/dev/node/sonar/tome/hello'. Moved file '/home/mike/dev/node/sonar/moveme/test' to '/home/mike/dev/node/sonar/tome/test'. Moved file '/home/mike/dev/node/sonar/moveme/test2' to '/home/mike/dev/node/sonar/tome/test2'. Moved file '/home/mike/dev/node/sonar/moveme/test23' to '/home/mike/dev/node/sonar/tome/test23'. Moved file '/home/mike/dev/node/sonar/moveme/test234' to '/home/mike/dev/node/sonar/tome/test234'.
受ma11hew28答案的启发,这与上面相同,但具有fs.promises中的异步功能。如ma11hew28所述,与v12.12.0中添加的fs.promises.opendir 相比,它可能具有内存限制。
下面的快速代码。
//jshint esversion:8 //jshint node:true const fs = require( 'fs' ); const path = require( 'path' ); const moveFrom = "/tmp/movefrom"; const moveTo = "/tmp/moveto"; // Make an async function that gets executed immediately (async ()=>{ // Our starting point try { // Get the files as an array const files = await fs.promises.readdir( moveFrom ); // Loop them all with the new for...of for( const file of files ) { // Get the full paths const fromPath = path.join( moveFrom, file ); const toPath = path.join( moveTo, file ); // Stat the file to see if we have a file or dir const stat = await fs.promises.stat( fromPath ); if( stat.isFile() ) console.log( "'%s' is a file.", fromPath ); else if( stat.isDirectory() ) console.log( "'%s' is a directory.", fromPath ); // Now move async await fs.promises.rename( fromPath, toPath ); // Log because we're crazy console.log( "Moved '%s'->'%s'", fromPath, toPath ); } // End for...of } catch( e ) { // Catch anything bad that happens console.error( "We've thrown! Whoops!", e ); } })(); // Wrap in parenthesis and call now