2013-04-11 5 views
0

파일을 데이터베이스에 저장하지 않고 파일의 해시를 비교하는 가장 간단한 방법은 무엇입니까? 예를 들어암호화 모듈 - Node.js

:

var filename = __dirname + '/../public/index.html'; 
var shasum = crypto.createHash('sha1'); 

var s = fs.ReadStream(filename); 
s.on('data', function(d) { 
    shasum.update(d); 
}); 

s.on('end', function() { 
    var d = shasum.digest('hex'); 
    console.log(d + ' ' + filename); 

    fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) { 
    if(err) { 
     console.log(err); 
     } else { 
     console.log("The file was saved!"); 
     } 
    }); 
}); 

위의 코드는 HTML 파일의 해시를 반환합니다. 파일을 편집하면 파일이 변경되었는지 어떻게 알 수 있습니까? 즉, 해시가 변경되었는지 어떻게 알 수 있습니까?

제안 사항? 편집

지금 해시는 로그 파일에 저장되고있다. 파일에서 해시를 검색하고 새로 생성 된 해시와 일치 시키려면 어떻게해야합니까? 코드 예제는 나에게 더 나은 이해를 줄 수있는 멋진 것입니다.

이 차이는 무엇입니까? question이지만 아직 구현 방법이 명확하지 않습니다.

+1

로그 파일의 형식은 무엇입니까 :

여기에 코드에 관한 예입니다? 그리고 로그 파일의 특성은 무엇입니까? html 파일 당 하나의 '로그 파일'이 있습니까? 또는 무엇을? –

+0

OK 형식이 .txt라고 가정 해 보겠습니다. 지금은 log.txt가 하나 있고 HTML 파일을 수정할 때마다 새 해시가 파일의 이전 해시를 덮어 씁니다. 새 해시를 덮어 쓰기 전에 이전 해시와 일치시키는 방법이 있습니까? 같은 일을하는 훨씬 간단한 방법이 있습니까? – giokokos

+0

새 대답 또는 내 대답에 대한 편집이 도움이되는지 확인하십시오. –

답변

1

은 파일의 변경을 찾고 있다면, 당신은 노드의 파일 시스템의 기능 중 하나, fs.watch를 사용할 수 있습니다. 이것은이 사용되는 방법이다 : 당신이 대안으로 fs.watchFile을 사용할 수 있도록

fs.watch(filename, function (event, filename) { 
    //event is either 'rename' or 'change' 
    //filename is the name of the file which triggered the event 
}); 

시계 기능은, 그러나 매우 일치하지 않습니다. fs.watchFile은 통계 폴링을 사용하므로 파일 변경을 즉시 감지하는 fs.watch보다 약간 느립니다.

파일을 보는 중 이벤트 changeerror이있는 fs.FSWatcher의 인스턴스가 반환됩니다. .close을 호출하면 파일의 변경 사항을 감시하지 않습니다.

var filename = __dirname + '/../public/index.html'; 
var shasum = crypto.createHash('sha1'); 

var oldhash = null; 

var s = fs.ReadStream(filename); 
s.on('data', function(d) { 
    shasum.update(d); 
}); 

s.on('end', function() { 
    var d = shasum.digest('hex'); 
    console.log(d + ' ' + filename); 
    oldhash = d.toString(); 

    fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) { 
    if(err) { 
     console.log(err); 
     } 
     else { 
     console.log("The file was saved!"); 
     } 
    }); 
}); 

//watch the log for changes 
fs.watch(__dirname + "/../public/log.txt", function (event, filename) { 
    //read the log contents 
    fs.readFile(__dirname + "/../public/log.txt", function (err, data) { 
    //match variable data with the old hash 
    if (data == oldhash) { 
     //do something 
    } 
    }); 
}); 
+0

정확히 내가 무엇을 찾고 있었습니까! 감사! – giokokos

0

이 질문과 previous one you asked의 차이점은 무엇입니까? 데이터베이스에 저장하고 싶지 않다면 파일로 저장하십시오. 여러 파일의 해시를 저장하려면 JSON 객체에 해시를 넣고 .json 파일로 작성하여 읽기/쓰기가 쉽습니다.

EDIT는 질문에 추가 된 것을 감안할 때

, 그것은 아주 간단해야한다. 당신은 기능을 확인하고 다시 쓰기하려면 작성할 수 있습니다

function updateHash (name, html, callback) { 
    var sha = crypto.createHash('sha1'); 
    sha.update(html); 
    var newHash = sha.digest('hex'); 

    var hashFileName = name + '.sha'; 

    fs.readFile(hashFileName, 'utf8', function (err, oldHash) { 
     var changed = true; 
     if (err) 
      console.log(err); // probably indicates the file doesn't exist, but you should consider doing better error handling 

     if (oldHash === newHash) 
      changed = false; 

     fs.writeFile(hashFileName, newHash, { encoding: 'utf8' }, function (err) { 
      callback(err, changed); 
     }); 
    }); 
} 

updateHash('index.html', "<html><head><title>...", function (err, isChanged) { 
    // do something with this information ? 
    console.log(isChanged); 
}); 
+0

내 질문을 편집했습니다. – giokokos