2015-01-22 1 views
1

.jpg 파일 인 경우 디렉토리 (및 모든 하위 디렉토리)를 이동하고 모든 이미지의 이름을 바꾸 (이동)하려고합니다. 제 코드가 맞다고 생각합니다. 비동기 이름 바꾸기 및 증가 카운터를 사용하여 파일 이름을 늘리고 있습니다. 그러나 어떤 이유로 4 개 정도의 하위 폴더가있는 테스트에서 이미지의 절반 만 이름이 변경됩니다. 콜백 파일 (일단 이미지의 이름이 바뀌면)이 증가 할 때 rename이 호출되는 모든 파일이 콘솔 목록에 있는지 확인할 때만 증가 이유는 모르겠습니다.노드 : 디렉토리의 모든 파일 이름을 바꾸는 중 일부가 건너 뜁니다.

var fs = require('fs'); 
var filePrefix = 'new_Images'; 
var folderName = 'changed'; 
var counter = 0; 

function examine (path) { 
    fs.readdir(path, function (err, files) { 
    files.forEach(function (file) { 

     var oldPath = path + file; 

     fs.stat(oldPath, function (err, stats) { 
     if (stats.isDirectory()) { 
      examine(oldPath + '/'); 
     } else { 

      var suffix = oldPath.substr(oldPath.length - 3); 

      if (suffix === 'jpg') { 
      fs.rename(oldPath, './' + folderName + '/' + filePrefix + counter + '.jpg', function (e) { 
       if (e) throw new Error('something bad happened'); 
       console.log('Renamed a .jpg file'); 
       console.log(oldPath); 
       console.log(counter); 
       counter++; 
      }); 
      } else if (suffix === 'png') { 
      fs.rename(oldPath, './' + folderName + './' + filePrefix + counter + '.png', function (e) { 
       if (e) throw new Error('something bad happened'); 
       console.log('Renamed a .png file'); 
       console.log(oldPath); 
       console.log(counter); 
       counter++; 
      }); 
      } 
     } 
     }); 
    }); 
    }); 
} 

examine('./'); 

이 코드는 모든 파일 이름이 변경되었다는 것을 기록합니다, 그리고 모든 파일이 삭제됩니다,하지만 그들 중 절반 만이 실제로 내가 같은데요

답변

3

새 폴더에 (이름) 이동 파일은 덮어 쓰게됩니다.

이름을 바꾸는 동안 비동기 호출이 이루어 지므로 이름을 바꾼 후에 비동기 호출을하기 전에 counter을 증가시켜야합니다. 비동기 호출에는 순서가 없으므로 동일한 이름으로 성공적인 이름 변경 작업을 수행하기 전에 호출의 절반이 수행됩니다.

당신은 파일 이름을 기록하여이를 확인할 수는 :

if (suffix === 'jpg') { 
    console.log('renaming with file name ' + filePrefix + counter + '.jpg'); 
    fs.rename(oldPath, './' + folderName + '/' + filePrefix + counter + '.jpg', function (e) { 
    ... 
    }); 
} else if (suffix === 'png') { 
    console.log('renaming with file name ' + filePrefix + counter + '.png'); 
    fs.rename(oldPath, './' + folderName + './' + filePrefix + counter + '.png', function (e) { 
    ... 
    }); 
} 
0

이 프로그램은 모든 요구 사항을 충족

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

var oldPath = 'G:\\oldPath\\oldPath'; 
var newPath = 'G:\\newPath\\newPath\\'; 
var ext = 'jpg'; 
var newPrefix = 'newPrefix'; 

var myFun = function(mypath) { 
fs.readdir(mypath, function(error, files) { 
    if (error) 
     console.log('error ' + error.code + ' : ' + error.message); 
    else { 
     files.map(function(file) { 
      return path.join(mypath, file) 
     }).filter(function(file) { 
      if(fs.statSync(file).isFile()) 
       return file; 
      else 
       return myFun(file); 
     }).forEach(function(file){ 
      var path_file = file.split('\\'); 
      var extension = path_file[path_file.length - 1].split('.'); 
      if (extension[1] === ext) { 
       var source = fs.createReadStream(file); 
       var target = fs.createWriteStream(newPath + newPrefix + path_file[path_file.length - 1]); 
       source.pipe(target); 
       fs.unlink(file); 
      } 
     }) 
    } 
}) 
} 
관련 문제