2013-08-18 2 views
0

나는 파일이 어떤 물리적 미디어인지 (파일 이름 또는 핸들에 의해) 알아 내고 싶다.파일이 어떤 물리적 드라이브에 있는지 어떻게 알 수 있습니까?

나는 DeviceIoControl 호출로 지정된 파티션 핸들의 실제 드라이브를 확인할 수있는 here을 읽었습니다.

하지만 파일 이름에서 파티션 핸들을 얻으려면 어떻게해야합니까? (NTFS는 폴더에 파티션을 마운트 할 수 있기 때문에 단순히 드라이브 문자로 이동할 수는 없습니다.)

내가 비난하는 이유는 비동기 메서드를 사용할 때 파일을 다른 실제 드라이브에 복사하는 것이 가장 빠르기 때문입니다. 동일한 드라이브가 더 큰 버퍼와 동 기적으로 완료되면 가장 빠릅니다. 내가 주어진 파일과 대상에 대한 최적의 복사 알고리즘을 결정하는 함수를 작성하고 싶다.

+0

내가 기대 당신은 Windows를 유지하지 않는 한, 파일에 대한 모든 연결된 미디어를 검색해야한다고 파일 이름을 볼륨 문자에 매핑하는 테이블 –

+0

* 논리적 * 드라이브를 의미합니다. 예를 들어, SQL Server는 RAID5로 실행되는 3 개의 SAS 15K 드라이브에 기본 데이터 저장소를 가지고 있습니다. RAID에 저장된 파일은 * 모든 드라이브에 있습니다. – WhozCraig

+0

@WhozCraig 예.하지만 두 개의 논리 드라이브가 동일한 실제 드라이브에있는 경우 동기식 복사를 사용하고 싶습니다 (가능한 경우). –

답변

1

Windows의 볼륨은 일반적으로 드라이브 공유에 매핑됩니다 (네트워크 공유 제외).

CreateFile()을 드라이브 문자 경로 (예 : \\. \ C : \)로 전달하여 소스 및 대상에 볼륨 파일 장치 핸들을 만들 수 있습니다. DeviceIoControl()과 함께 반환 된 핸들을 사용하십시오. 원본과 대상 사이의 실제 드라이브를 비교하면 좋을 것입니다.

토론은 여기에서 설명 : "오픈 볼륨의 물리적 드라이브 ID를 얻으려면 ..." http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

+1

실제로 볼륨은 드라이브 문자에 매핑되지만 매핑되지는 않습니다. 매핑되지 않은 볼륨은 Win32 API 바이 패스 접두사 '\\. \'를 사용하여 NT 네임 스페이스를 통해 계속 액세스 할 수 있습니다. 그것들은 생성, 열, 읽기 및 쓰기가 가능합니다. – wallyk

+0

@wallyk Clarified, thanks. 감사합니다. –

+0

볼륨이 다른 볼륨의 디렉토리에 마운트 될 수 있기 때문에 드라이브 문자로 이동할 수 없습니다. 나는 그것을 분류하기 위해'GetVolumePathName'과'GetVolumeNameForVolumeMountPoint'를 사용하고 볼륨 이름 ("\ Device \ HarddiskVolumeX"에 대한 심볼릭 링크 임)을 해결해야 할 것입니다. 그런 다음 "HarddiskYPartitionZ"장치를 열거하고 방금 해결 한 장치 X를 ​​가리키는 장치를 확인할 수 있습니다. 그렇다면 Y는 내 육체적 인 운전입니다. –

관련 문제