2010-07-23 2 views
3

FTP (다른 기능들)와 비슷한 파일 전송 기능을 제공하는 프로토콜, 클라이언트 및 서버를 만들고 있습니다. 내 프로토콜과 FTP의 한 가지 차이점은 원격 서버의 디렉토리 구조 복사본을 로컬 캐시에 저장하고 싶다는 것입니다. 서버는 Windows (C++로 작성)에서만 실행되므로 적용 가능한 Win32 API 호출이 있으면 평가할 수 있습니다 (있는 경우). 처음에 연결되면 클라이언트는 즉각적인 자식 (옵션이없는 "ls"또는 "dir"과 같은 파일 및 디렉토리)을 요청한 다음 사용자가 디렉토리로 이동할 때이 단계를 예상대로 새 부모와 반복합니다 .프로그램 실행을 통해 디렉토리의 변경 사항을 어떻게 감지 할 수 있습니까?

물론 대부분의 경우 주어진 서버의 동일한 디렉토리가 클라이언트에 의해 두 번 요청되면 디렉토리의 내용은 동일합니다. 따라서 클라이언트에 각 디렉토리 목록의 결과를 캐시하고 싶습니다. 나는 이것을 구현하는 간단한 방법을 원하지만, 파일/디렉토리 액세스와 수정 시간과 이름 변경으로 인해 캐시 엔트리 만료가 고려 될 필요가있다. 까다로운 부분이다. 나는 파일 내용뿐만 아니라 하위 디렉토리의 내용, 파일 이름, 데이터, 수정 및 액세스 날짜 등을 고려한 해시와 같은 것으로 클라이언트가 거의 즉시 디렉토리 목록을 작성할 수있는 것이 이상적입니다.

프로그램이 가끔씩 만 실행되는 경우에도이 캐시를 유지해야하므로 FileSystemWatcher (또는 유사한) 개체에 완전히 의존 할 수있는 것은 아닙니다. 물론 캐시를 유지하는 데 도움이되는 것은 좋지만 문제의 일부일뿐입니다.

FindFirstFile() 및 FindNextFile(), 정렬 (여하튼), WIN32_FIND_DATA 구조체 (어쩌면 파일 내용 포함)에있는 값을 연결하여 해싱 한 결과를 토큰으로 사용하고 있습니다. 만료 (해당 필드의 변경을 나타 내기 위해). 그런 다음 각 디렉토리에 대해이 토큰 중 하나를 갖습니다. 디렉토리가 요청되면 서버는 모든 것을 해시하고이를 클라이언트가 제공 한 캐시 된 해시와 비교하고, 다른 경우 일반 데이터를 반환하고, 그렇지 않으면 HTTP 304를 반환합니다. 이런 식으로하는 덜 정교한 방법이 있습니까? "디렉토리 최종 수정일"은 모든 상황에서 서브 디렉토리의 파일 수정 날짜를 모두 고려합니까? 내장 된 Windows 인덱싱 서비스에는 이와 같은 것이 있지만 이상적으로는 그 서비스에 의존 할 필요가 없다고 확신합니다.

이 서비스는 파일 공유를위한 것이기 때문에 해시 관련 작업이 특히 유용하기 때문에 주어진 파일을 공유하는 다른 사용자를 자동으로 효율적으로 찾을 수는 있지만 해시 계산 중에 디스크에 신경 쓰지 않아도됩니다 .

프로그래밍에 익숙하지 않은 다른 사람들이이 문제를 해결하기 위해 무엇을 할 것인지 궁금합니다 (rsync와 subversion은 비슷한 문제를 해결했지만 동일하지는 않습니다).

답변

0

매우 작은 두뇌의 파일 시스템 구현을 많이 요구하고 있습니다 (A. A. Milne에게 사과와 함께).

이것은 실제로 잘 어울리지 않으며 분산 파일 시스템에 대한 기존의 문헌을 살펴 보는 것이 좋습니다. AFS은 매우 잘 연구 된 접근법의 한 예입니다.

심각한 숙제를하지 않고도 유용하고 정확한 것을 생각해 낼 수 있을지 의심 스럽습니다. 다른 말로하면, '모든 선행 기술을 무시하는 것은 어리 석다.

관련 문제