Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
[API] 모든 드라이브 경로 구하기
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2010. 4. 11. 04:39 ) | 신고


문득, MSDN에서 놀다가 FindFirstVolume 함수가 보이길래 한번 써보도록 해보자~

일단, 모든 드라이브의 경로를 구하기 위해선 아래와 같은 함수가 필요하다.

FindFirstVolume, FindNextVolume, FindVolumeClose, GetVolumePathNamesForVolumeName

마지막에 무지하게 기네 . . .

일단, 하나하나 함수의 구조를 보자 'ㅅ'~




 HANDLE WINAPI FindFirstVolume(
   __out  LPTSTR lpszVolumeName,
   __in   DWORD cchBufferLength
 );


lpszVolumeName [out]
- GUID 볼륨 코드를 읽어온다.

cchBufferLength [in]
- 위 lpszVolumeName 의 문자열 메모리 크기를 집어넣으면 된다.

이 함수의 리턴값은 반드시 어떤곳에 저장해둬야 합니다.
실패하면, 리턴값은 INVALID_HANDLE_VALUE 으로 변하고,
GetLastError로 정확한 오류를 볼 수 있습니다.




 BOOL WINAPI FindNextVolume(
   __in   HANDLE hFindVolume,
   __out  LPTSTR lpszVolumeName,
   __in   DWORD cchBufferLength
 );


hFindVolume [in]
- FindFirstVolume 함수에서 구한 핸들값을 집어넣는다.

lpszVolumeName [out]
- GUID 볼륨 코드를 읽어온다.

cchBufferLength [in]
- 위 lpszVolumeName 의 문자열 메모리 크기를 집어넣으면 된다.


리턴값으로 다음 볼륨이 존재 유무를 확인할 수 있다.




 BOOL WINAPI FindVolumeClose(
   __in  HANDLE hFindVolume
 );


hFindVolume [in]
- FindFirstVolume 함수에서 구한 핸들값을 집어넣는다.




 BOOL WINAPI GetVolumePathNamesForVolumeName(
   __in   LPCTSTR lpszVolumeName,
   __out  LPTSTR lpszVolumePathNames,
   __in   DWORD cchBufferLength,
   __out  PDWORD lpcchReturnLength
 );


lpszVolumeName [in]
- GUID 볼륨 코드를 넣는다.

lpszVolumePathNames [out]
- 해당 GUID 볼륨 코드을 가진 볼륨의 메인 디렉토리 경로를 구한다.

cchBufferLength [in]
- lpszVolumePathNames의 문자열 메모리 크기를 집어넣으면 된다.

lpcchReturnLength [out]
- 해당 함수가 성공할 경우 디렉토리 경로의 문자열 갯수가 여기에 담긴다.




Ex ) 모든 드라이브의 경로를 구하는 소스


 // 2010. 04. 11 Volume Find
 // Coding by Fore ( http;//foreblog.tistory.com/ )

 #include <windows.h>

 #include <tchar.h>
 #include <stdio.h>


 // 유니코드 호환을 위해 printf 를 매크로 설정해둔다.
 #ifdef UNICODE
 #define lprintf wprintf
 #else
 #define lprintf printf
 #endif


 int main(void){

 HANDLE                    hVolume = NULL;                  // 볼륨 찾기 핸들
 DWORD                     RetnVal = 0;                         // 리턴값
 TCHAR                      VolumeName[MAX_PATH+1]; // 볼륨 저장 버퍼
 TCHAR                      Path[MAX_PATH+1];             // 디렉토리 버퍼

 // 버퍼 초기화
 ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
 ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));

 // 볼륨 이름 찾기 시작
 hVolume = FindFirstVolume(VolumeName,MAX_PATH);
 if ( hVolume == INVALID_HANDLE_VALUE )
      return 0;
 // 볼륨 이름을 통해 디렉토리 경로를 구해온다.

 GetVolumePathNamesForVolumeName(VolumeName,Path,MAX_PATH,&RetnVal);
 // 출력

 lprintf(_T("%s %s\n"),Path,VolumeName);

 // 버퍼 초기화
 ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
 ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));

 // 반복
 while(FindNextVolume(hVolume,VolumeName,MAX_PATH)){
    GetVolumePathNamesForVolumeName(VolumeName,Path,MAX_PATH,&RetnVal);
    lprintf(_T("%s %s\n"),Path,VolumeName);
    ZeroMemory(VolumeName,(MAX_PATH+1)*sizeof(TCHAR));
    ZeroMemory(Path,(MAX_PATH+1)*sizeof(TCHAR));
 }
 // 볼륨 찾기 종료

 FindVolumeClose(hVolume);

 // 핸들 초기화
 hVolume = NULL;
 RetnVal = 0;

 return 0;
 }


추가로, 해당 드라이브 경로가 하드디스크(HDD)인지 CD/DVD-ROM(ODD) 인지 확인하고자 하면

GetDriveType 을 쓰면 된다.
( 이거로 그냥 A드라이브부터 Z드라이브까지 경로 돌려도 위와 같은 결과를 얻을 수 있다. )




 UINT WINAPI GetDriveType(
   __in_opt  LPCTSTR lpRootPathName
 );


lpRootPathName [in, optional]
- 드라이브 경로를 적으면 된다.
만약, 이 값에 NULL 이 들어갈 경우, 현재 위치의 드라이브의 타입을 구하게 된다.

드라이브 타입을 확인은 리턴값으로 확인한다.

리턴값은 http://msdn.microsoft.com/en-us/library/aa364939(VS.85).aspx 에서 확인 가능하다.


Written by Fore  
http://foreblog.tistory.com

'Programming > Programming Talk' 카테고리의 다른 글

모처럼이니까 !  (0) 2011.08.07
심심해서 적어보는 ReverseMe ! 풀이 [2]  (6) 2010.08.24
[업데이트] Image Downloader Beta 1.1v  (4) 2010.02.10
Image Downloader Beta 1.0  (8) 2010.01.18
WAV 구조 (?)  (2) 2009.08.26
Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today :
Yesterday :