구 블로그 이전글
작성일 : 2010-01-26 20:20

 

원본 : http://greenmaru.com/4

참고: http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx

폴더 및 파일 경로 조작에 필요한 API 정리.

이런 API들이 있는걸 모르고 몇개는 필요할때 만들어서 쓰기도 했었는데-_-..
아무래도,간단하게 직접 구현한 함수들 보다는 더 꼼꼼하게 만들어져 있다. (적어도 내가 만든 것들 보다는;;)

A부터 Z까지 직접 만들어서 써야 만족하는 변태-_-가 아니라면 참고해보자.
굵게(Bold)처리한 함수들은 자주 쓰일법한 녀석들이다.

사용하기 위해서는 shlwapi.h를 include하고 shlwapi.lib를 링크해야 한다.

LPTSTR PathAddBackslash( LPTSTR lpszPath );

Adds a backslash to the end of a string to create the correct syntax for a path. If the source path already has a trailing backslash, no backslash will be added.

경로 문자열의 맨 뒤에 ‘\’를 붙여준다. 만약 이미 ‘\’문자로 종결된 상태라면 아무일도 하지 않는다.
lpszPath는 MAX_PATH크기(또는 그 이상)이라야 하며, lpszPath에 ‘\’를 더 붙일 수 없다면 NULL이 반환된다.

BOOL PathAddExtension( LPTSTR pszPath, LPCTSTR pszExtension );

Adds a file extension to a path string.

파일 경로(pszPath)의 맨 뒤에 지정된 확장자를 붙여준다.
만약 pszPath가 이미 확장자가 포함된 파일 경로라면 아무일도 하지 않는다.
pszExtension이 NULL이라면 기본적으로 “.exe”가 붙는다.

BOOL PathAppend( LPTSTR pszPath, LPCTSTR pszMore );

Appends one path to the end of another.

두개의 경로 문자열 결합. pszPath에 pszMore를 붙여준다. 필요하다면 ‘\’ 문자를 사용해 결합한다.

LPTSTR PathBuildRoot( LPTSTR szRoot, int iDrive );

Creates a root path from a given drive number.

드라이브 식별 번호(iDrive)를 문자열 형(szRoot)으로 변환해 준다. 0 = a:\ 뭐 이런식이다.

BOOL PathCanonicalize( LPTSTR lpszDst, LPCTSTR lpszSrc );

Canonicalizes a path.

경로에 상대경로 지정문자 ( “./”, “../”)가 포함되어 있다면 이를 적절하게 처리해준다. lpszsrc=”c:\\a\\b\\..\\c” temp_src=”c:\\a\\b\\..\\c”라면 lpszDst = “c:\\a\\c”가 된다.

LPTSTR PathCombine( LPTSTR lpszDest, LPCTSTR lpszDir, LPCTSTR lpszFile );

Concatenates two strings that represent properly formed paths into one path; also concatenates any relative path elements.

폴더 경로 + 파일경로로 구성해준다. lpszDest = lpszDir + lpszFile.
적절하게 ‘\’를 사용해서 연결해 주며, 상대경로가 포함되어 있다면 이또한 적절하게 처리해 준다.
적절한 함수로군-ㅅ-ㅋㅋ

int PathCommonPrefix( LPCTSTR pszFile1, LPCTSTR pszFile2, LPTSTR pszPath );

Compares two paths to determine if they share a common prefix. A prefix is one of these types: “C:\\”, “.”, “..”, “..\\”.

두 경로 pszFile1과 pszFile2에서 어디까지가 공통된 경로인지 조사하고, pszPath에 공통된 부분을 담아준다.
공통된 부분이 없다면 pszPath는 NULL로 설정된다.

BOOL PathCompactPath( HDC hDC, LPTSTR lpszPath, UINT dx );

Truncates a file path to fit within a given pixel width by replacing path components with ellipses.

lpszPath에 포함된 경로 문자열을 dx pixel 크기에 출력하기 적절하게 잘라준다.
C:\path1\path2\sample.txt
C:\path1\…\sample.txt
C:\p…\sample.txt

BOOL PathCompactPathEx( LPTSTR pszOut, LPCTSTR pszSrc, UINT cchMax, DWORD dwFlags );

Truncates a path to fit within a certain number of characters by replacing path components with ellipses.

PathCompactPath와 유사하다. 다만, pixel단위가 아니라 최대 cchMax만큼 잘라낸다.

HRESULT PathCreateFromUrl( LPCTSTR pszUrl, LPTSTR pszPath, LPDWORD pcchPath, DWORD dwReserved );

Converts a file URL to a Microsoft MS-DOS path.

URL형태로 구성된 경로를 Windows 경로 형식으로 변환해 준다. file:///c:/test.txt = c:\test.txt.
주의: S_OK가 반환되지 않았다면 pszPath는 아무런 변화도 일어나지 않았다는 소리다!!
또, 실제 URL(Web)이 아니라 Local File Url이라야 한다.

BOOL PathFileExists( LPCTSTR pszPath );

Determines whether a path to a file system object such as a file or directory is valid.

제시된 경로의 파일/폴더가 실제로 존재하는지 검사한다.

LPTSTR PathFindExtension( LPCTSTR pPath );

Searches a path for an extension.

파일 경로에서 확장자를 찾아준다. (pPath에서 확장자가 시작되는 위치를 반환).

LPTSTR PathFindFileName( LPCTSTR pPath );

Searches a path for a file name.

파일 경로에서 파일 이름을 찾아준다. (pPath에서 이름이 시작되는 위치를 반환).

LPTSTR PathFindNextComponent( LPCTSTR pszPath );

Parses a path for the next path component.

다음 위치의 경로를 찾아준다. 어떤 경로에 대해 순자접근이 필요하다면 사용해볼 법 하다.
PathFindNextComponent( “c:\windows\system32” ) = windows\system32
PathFindNextComponent( “windows\system32”) = system32

BOOL PathFindOnPath( LPTSTR pszFile, LPCTSTR *ppszOtherDirs );

Searches for a file.

파일을 검색한다. 만약 검색에 성공하면 pszFile에는 해당 파일의 전체 경로가 담겨져서 반환된다.
ppszOtherDirs가 NULL이라면 windows 기본 경로(system32, 환경 변수 path의 값 등)에서 파일을 검색한다.
주의: 여러개의 파일이 존재 하더라도, 첫번째로 검색된 파일의 경로만 반환한다.

LPCTSTR PathFindSuffixArray( LPCTSTR pszPath, const LPCTSTR *apszSuffix, int iArraySize );

Determines whether a given file name has one of a list of suffixes.

PathFindOnPath와 유사하다. 다만, apszSuffix를 통해 검색할 경로를 여러개 지정할 수 있다. (기본경로 검색은 하지 않는다.)
주의: 대소문자를 구분한다.

LPTSTR PathGetArgs( LPCTSTR pszPath );

Finds the command line arguments within a given path.

경로에 포함된 매개변수(argv)를 찾아준다.
PathGetArgs(“c:\test.exe temp.txt /x”) = “temp.txt /x”

UINT PathGetCharType( TUCHAR ch );

Determines the type of character in relation to a path.

문자가 경로 문자열에 사용되면 어떤 의미인지 알려준다. 경로에 포함될 수 있는 문자인가? 경로 구분자(‘\’)인가? 등등..
이 함수를 이용해서 경로에 사용할 수 있는 문자열인지를 검사할 수 있다.

int PathGetDriveNumber( LPCTSTR lpsz );

Searches a path for a drive letter within the range of ‘A’ to ‘Z’ and returns the corresponding drive number.

제시된 경로에 포함된 드라이브 문자(c:\) 의 식별 번호를 반환한다.

BOOL PathIsContentType( LPCTSTR pszPath, LPCTSTR pszContentType );

Determines if a file’s registered content type matches the specified content type. This function obtains the content type for the specified file type and compares that string with the pszContentType. The comparison is not case-sensitive.

제시된 파일경로가(확장자만 넘겨줘도 된다;) 등록된 contents type과 일치하는지 검사한다.
PathIsContentType( “c:\temp.txt”, “text/plain” ) = TRUE

BOOL PathIsDirectory( LPCTSTR pszPath );

Verifies that a path is a valid directory.

실제로 존재하는 폴더인지 확인한다.

BOOL PathIsDirectoryEmpty( LPCTSTR pszPath );

Determines whether a specified path is an empty directory.

비어있는(안에 파일이나 서브 폴더가 없는) 폴더인지 확인한다.

BOOL PathIsFileSpec( LPCTSTR lpszPath );

Searches a path for any path-delimiting characters (for example, ‘:’ or ‘\’ ). If there are no path-delimiting characters present, the path is considered to be a File Spec path.

제시된 경로가 파일명만으로 구성되어 있는지 조사한다. 
정확히 말하자면, 경로를 구성하는데 사용되는 문자 (경로 구분자’\’ 라던지, 드라이브 구분자’:’ 라던지..)가 포함되어 있으면 FALSE가 반환된다.
주의: 파일명으로 사용할 수 없는 문자(/, :, * 등)가 들어있는가? 를 검사하는 함수가 아니다!!

BOOL PathIsHTMLFile( LPCTSTR pszFile );

Determines if a file is an HTML file. The determination is made based on the content type that is registered for the file’s extension.

제시된 경로의 확장자가 HTML 유형인가를 검사한다.
한마디로, 레지스트리에 등록된 content type이 text/html이라면 TRUE. (.htm, .html, .xhtml …)

BOOL PathIsLFNFileSpec( LPCTSTR pszName );

Determines whether a file name is in long format.

제시된 경로가 Long File Name spec에 적합한지 검사한다. (아마 쓸 일은 거의 없을듯 싶다 -_-;)

BOOL PathIsNetworkPath( LPCTSTR pszPath );

Determines whether a path string represents a network resource.

경로가 네트워크 경로라면 TRUE. 단, 실제로 존재하는 네트워크 경로인가는 다른 얘기다!

BOOL PathIsPrefix( IN LPCTSTR pszPrefix, IN LPCTSTR pszPath );

Searches a path to determine if it contains a valid prefix of the type passed by pszPrefix. A prefix is one of these types: “C:\\”, “.”, “..”, “..\\”.

경로가 pszPrefix로 시작되는가를 검사한다. 같은 드라이브에 있는 파일인지 검사할때 유용하다.

BOOL PathIsRelative( LPCTSTR lpszPath );

Searches a path and determines if it is relative.

경로가 상대경로인지 검사한다.
주의: 파일명만 제시된 경우, 상대경로로 인식한다.
PathIsRelative(“../../temp.txt”) = TRUE
PathIsRelative(“c:/temp.txt”) = FALSE
PathIsRelative(“temp.txt”) = TRUE

BOOL PathIsRoot( LPCTSTR pPath );

Parses a path to determine if it is a directory root.

경로가 루트 폴더(드라이브 바로 밑)인지 검사한다. 
PathIsRoot(“c:\”) = TRUE
PathIsRoot(“c:\windows”) = FALSE

BOOL PathIsSameRoot( LPCTSTR pszPath1, LPCTSTR pszPath2 );

Compares two paths to determine if they have a common root component.

pszPath1과 pszPath2가 같은 드라이브(루트폴더)에 있는지 검사한다.
PathIsSameRoot( “c:\test1\temp1.txt”, “c:\test2\temp2.txt” ) = TRUE

BOOL PathIsSystemFolder( LPCTSTR pszPath, DWORD dwAttrb );

Determines if an existing folder contains the attributes that make it a system folder. Alternately, this function indicates if certain attributes qualify a folder to be a system folder.

제시된 경로가 시스템 폴더인지 검사한다.

BOOL PathIsUNC( LPCTSTR pszPath );

Determines if the string is a valid Universal Naming Convention (UNC) for a server and share path.

UNC(공유)경로인지 확인한다.
PathIsUNC(“\\server\folder\”) = TRUE
PathIsUNC(“server\folder”) = FALSE

PathIsUNCServer( LPCTSTR pszPath );

Determines if a string is a valid Universal Naming Convention (UNC) for a server path only.

PathIsUNC와 다른점은 pszPath가 서버이름만으로 구성되어야 한다는 점이다. 주의할 점은, pszPath가 “\\”만으로 된 경우도 TRUE라는 점이다.
PathIsUNCServer(“\\server”) = TRUE
PathIsUNCServer(“\\server\folder”) = FALSE

BOOL PathIsUNCServerShare( LPCTSTR pszPath );

Determines if a string is a valid Universal Naming Convention (UNC) share path, \\ server\ share.

PathIsUNC와 다른점은 pszPath가 서버이름 + 공유경로만으로 구성되어야 한다는 점이다. (PathIsUNC는 파일명까지 넘어가도 TRUE)
주의: 대부분의 PathXXX 함수가 그렇듯, pszPath가 실존하는가는 관계없다!!!

BOOL PathIsURL( LPCTSTR pszPath );

Tests a given string to determine if it conforms to a valid URL format.

유효한 URL인지 확인한다.

BOOL PathMakePretty( LPTSTR lpPath );

Converts a path to all lowercase characters to give the path a consistent appearance.

경로를 소문자로 변환해준다. 이미 소문자로 이뤄져서 변환이 이뤄지지 않은 경우 FALSE가 반환된다.
주의할 점은, lpPath가 모두 대문자로 이뤄져 있어야 변환된다는 점이다 -_-;
PathMakePretty( “C:\TEST\TEMP.TXT” ) = “c:\test\temp.txt”
PathMakePretty( “c:\Test\Temp.txt”) = 변화 없음

BOOL PathMakeSystemFolder( LPTSTR pszPath );

Gives an existing folder the proper attributes to become a system folder.

지정된 폴더를 시스템 폴더로 만든다.

BOOL PathMatchSpec( LPCSTR pszFile, LPCSTR pszSpec );

Searches a string using a Microsoft MS-DOS wild card match type.

지정된 문자(열)이 경로에 포함되어 있는지 검사한다. DOS명령어 “dir *.bmp” 개념으로 생각하면 된다.
PathMatchSpec( “c:\test\temp.txt”, “*.txt”) = TRUE

BOOL PathMatchSpecEx( LPCTSTR pszFile, LPCTSTR pszSpec, DWORD dwFlags );

Searches a string using a Microsoft MS-DOS wild card match type and a flag.

PathMatchSpec과 유사하다. 차이점은, dwFlags에 PMSF_MULTIPLE를 사용하면 여러개의 검색 패턴 지정이 가능하다는 점.
주의: shlwapi.dll version 7.0.(Vista) 이상에서 사용 가능하다.
PathMatchSpecEx( “c:\test\temp.txt temp2.bmp”, “*.txt temp.*”, PMSF_MULTIPLE ) = TRUE

int PathParseIconLocation( LPTSTR pszIconFile );

Parses a file location string containing a file location and icon index, and returns separate values.

pszIconFile에 파일경로와 아이콘 인덱스가 포함되어 있는 경우 이를 적절하게 분리해 준다.
pszIconFile에는 경로가, 아이콘 인덱스는 반환값으로 나오게 되며, pszIconFile은 “경로, icon index”형식 이라야 한다.

BOOL PathQuoteSpaces( LPTSTR lpsz );

Searches a path for spaces. If spaces are found, the entire path is enclosed in quotation marks.

lpsz에서 공백이 발견되면 lpsz를 큰 따옴표(“)로 묶어준다. 공백이 없다면 아무일도 하지않고 FALSE가 반환된다.

BOOL PathRelativePathTo( LPTSTR pszPath, LPCTSTR pszFrom, DWORD dwAttrFrom, LPCTSTR pszTo, DWORD dwAttrTo );

Creates a relative path from one file or folder to another.

pszFrom에서 pszTo로 가는 상대경로를 구해서 pszPath에 담아준다. 당연한 소리지만 pszFrom과 pszTo는 동일한 Prefix에서 시작해야 한다.
TCHAR buffer[MAX_PATH];
BOOL PathRelativePathTo( buffer, “c:/a/b/c/”, FILE_ATTRIBUTE_DIRECTORY, “c:/a/1/2/test.txt”, FILE_ATTRIBUTE_NORMAL);
buffer = “../../1/2/test.txt”;

void PathRemoveArgs( LPTSTR pszPath );

Removes any arguments from a given path.

경로에 포함된 인자(argv)를 지워준다.

LPTSTR PathRemoveBackslash( LPTSTR lpszPath );

Removes the trailing backslash from a given path.

경로 맨 끝에 back slash(\)가 있다면 지워준다.

void PathRemoveBlanks( LPTSTR lpszString );

Removes all leading and trailing spaces from a string.

Trim과 유사하다. 경로 앞뒤의 공백을 제거한다.

void PathRemoveExtension( LPTSTR pszPath );

Removes the file extension from a path, if one is present.

확장자를 제거한다.

BOOL PathRemoveFileSpec( LPTSTR pszPath );

Removes the trailing file name and backslash from a path, if they are present.

파일이름을 제거한다. 주의할 점은 맨 끝의 “\”도 지워진다는거~
PathRemoveFileSpec(“c:\temp\test.txt”) = “c:\temp”

BOOL PathRenameExtension( LPTSTR pszPath, LPCTSTR pszExt );

Replaces the extension of a file name with a new extension. If the file name does not contain an extension, the extension will be attached to the end of the string.

파일 경로의 확장자를 지정된 확장자로 교체한다.
PathRenameExtension( “c:\temp\test.xml”, “.txt”) = “c:\temp\test.txt”

BOOL PathSearchAndQualify( LPCTSTR pcszPath, LPTSTR pszFullyQualifiedPath, UINT cchFullyQualifiedPath );

Determines if a given path is correctly formatted and fully qualified.

제시된 경로 pcszPath에 오류가 있다면 이를 바로잡아서 pszFullyQualifiedPath에 담아준다.
상대경로를 적절히 계산해 주고, 시스템 변수가 사용된 경우 이를 적절히 확장해 준다.
TCHAR buffer[MAX_PATH];
PathSearchAndQualify( “c:\a\..\b”, buffer, MAX_PATH) = c:\b;
PathSearchAndQualify( “c:\a\\\b”, buffer, MAX_PATH) = c:\a\b;
PathSearchAndQualify( “notepad.exe”, buffer, MAX_PATH) = c:\windows\system32\notepad.exe;
PathSearchAndQualify( “%SystemRoot%system32\notepad.exe”, buffer, MAX_PATH) = c:\windows\system32\notepad.exe;

void PathSetDlgItemPath( HWND hDlg, int id, LPCSTR pszPath );

Sets the text of a child control in a window or dialog box, using PathCompactPath to ensure the path fits in the control.

PathCompactPath와 유사하다. id로 지정된 Dialog Item에 출력하기 적합한 길이로 경로를 잘라준다.

LPCTSTR PathSkipRoot( LPCTSTR pszPath );

Parses a path, ignoring the drive letter or Universal Naming Convention (UNC) server/share path elements.

루트 경로를 제거한다. 로컬 경로인 경우 드라이브문자(c:\)가 지워지고, UNC경로인 경우 서버이름, 공유폴더 이름이 제거된다.
PathSkipRoot( “c:\temp\test.txt”) = temp\test.txt
PathSkipRoot( “\\server\c$\temp\test.txt”) = temp\test.txt

void PathStripPath( LPTSTR pszPath );

Removes the path portion of a fully qualified path and file.

전체 경로에서 파일이름(또는 마지막 폴더 이름)만을 남기고 제거한다.
PathStripPath(“c:\temp\test.txt”) = test.txt
PathStripPath(“c:\temp\foo”) = foo

BOOL PathStripToRoot( LPTSTR szRoot );

Removes all parts of the path except for the root information.

루트경로만 남기고 나머지를 제거한다.
PathStripToRoot(“c:\temp”) = c:\

void PathUndecorate( LPTSTR pszPath );

Removes the decoration from a path string.

이건 뭐라고 설명해야 되나 -_-; 예제를 보자. 참고로, “[n]”형태만 제거한다. (n), {n} 뭐 이런건 영향받지 않는다;
PathUndecorate( “temp[1].txt”) = temp.txt

BOOL PathUnExpandEnvStrings( LPCTSTR pszPath, LPTSTR pszBuf, UINT cchBuf );

Replaces folder names in a fully-qualified path with their associated environment string.

경로와 일치하는 환경변수로 치환해 준다.
char szBuffer[MAX_PATH];
PathUnExpandEnvStrings( “c:\windows\”, szBuffer, MAX_PATH ) = “%SystemRoot%”;

BOOL PathUnmakeSystemFolder( LPTSTR pszPath );

Removes the attributes from a folder that make it a system folder. This folder must actually exist in the file system.

폴더속성에서 system속성을 제거한다.

void PathUnquoteSpaces( LPTSTR lpsz );

Removes quotes from the beginning and end of a path.

경로를 둘러싼 큰 따옴표(“)를 제거해 준다.
PathUnquoteSpaces(“\”c:\temp\””) = c:\temp

BOOL SHSkipJunction( IBindCtx *pbc, const CLSID *pclsid );

Checks a bind context to see if it is safe to bind to a particular component object.

…이놈은 당최 뭐에 쓰라는건지 모르겠다 -_-;

HRESULT UrlApplyScheme( LPCTSTR pszIn, LPTSTR pszOut, LPDWORD pcchOut, DWORD dwFlags );

Determines a scheme for a specified URL string, and returns a string with an appropriate prefix.

경로앞에 적절한 scheme를 붙여준다. (http://, file:///, ftp:// 등)
효과는 그닥 기대하지 말자;;

HRESULT UrlCanonicalize( LPCTSTR pszUrl, LPTSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags );

Converts a URL string into canonical form.

URL경로에 포함된 상대경로( ‘.’, ‘..’) 를 적절하게 처리한다. dwFlag값에 따라 안전하지 않은 문자들을 escape처리 하는등의 기능도 수행할 수 있다.

HRESULT UrlCombine( LPCTSTR pszBase, LPCTSTR pszRelative, LPTSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags );

When provided with a relative URL and its base, returns a URL in canonical form.

두 URL경로를 합쳐준다.
UrlCombine( “http://www.greenmaru.com/”, “default.aspx”, lpszCombine, &dwSize, 0 ) = “http://www.greenmaru.com/default.aspx”
주의!
UrlCombine( “http://abc.com/a/b/c”, “d” …)는 “http://abc.com/a/b/d”가 된다.
UrlCombine( “http://abc.com/a/b/c/”, “d” …)로 해야 “http://abc.com/a/b/c/d”가 된다.

int UrlCompare( LPCTSTR pszURL1, LPCTSTR pszURL2, BOOL fIgnoreSlash );

Makes a case-sensitive comparison of two URL strings.

두 URL 문자열을 비교한다. (대소문자 구분 없음)

HRESULT UrlCreateFromPath( LPCTSTR pszPath, LPTSTR pszUrl, LPDWORD pcchUrl, DWORD dwReserved );

Converts a Microsoft MS-DOS path to a canonicalized URL.

로컬 경로문자열(c:\temp)을 URL포맷(file:///c:\temp)으로 변환해준다.

HRESULT UrlEscape( LPCTSTR pszURL, LPTSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags );

Converts characters in a URL that might be altered during transport across the Internet (“unsafe” characters) into their corresponding escape sequences.

URL로 사용할 수 없는 문자들(^, {, ” 등)을 URL encoding된 문자열로 변환해 준다.

HRESULT UrlEscapeSpaces( LPCTSTR pszURL, LPTSTR pszEscaped, LPDWORD pcchEscaped );

A macro that converts space characters into their corresponding escape sequence.

URL에 포함된 공백을 escapce처리 해 준다.

HRESULT UrlGetPart( LPCTSTR pszIn, LPTSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags );

Accepts a URL string and returns a specified part of that URL.

dwPart값에 따라 URL에서 특정부분을 분리해 준다. (hostname, port…)

BOOL UrlIs( LPCTSTR pszUrl, URLIS UrlIs );

Tests whether or not a URL is a specified type.

URL이 UrlIs에 제시된 조건(적합한 URL인가? 파일 경로인가? 등)에 맞는 구성인지 확인한다.

카테고리: Native

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다