All about Programming

Symbolic Link 파일인지 확인하는 방법 (Windows API)

민토즈 2020. 12. 31. 19:17
300x250

1. FindFirstFile로부터 File의 Symbolic Link 속성을 확인하는 방법

HANDLE FindFirstFileA( 
    LPCSTR                     lpFileName, 
    LPWIN32_FIND_DATAA lpFindFileData 
);

WIN32_FIND_DATAA의 dwFileAttributes 멤버가 FILE_ATTRIBUTE_SPARSE_FILE 속성이 있는지 확인

 dwReserved0 멤버가 IO_REPARSE_TAG_SYMLINK or IO_REPARSE_TAG_MOUNT_POINT 속성이 있는지 확인

 

2. GetFileAttribute로부터 File의 Symbolic Link 속성을 확인하는 방법

DWORD GetFileAttributesA(
     LPCSTR lpFileName
);

Return 값의 File Attribute 속성이 FILE_ATTRIBUTE_REPARSE_POINT인지 확인

 

3. Symbolic Link의 Target에 관한 정보를 얻는 방법

1) GetFinalPathNameByHandle

DWORD GetFinalPathNameByHandleA(
    HANDLE hFile,
    LPSTR  lpszFilePath,
    DWORD  cchFilePath,
    DWORD  dwFlags
);

특정 파일의 최종 경로를 제공해주는 API

ex) symbolic link name "C:\tmp\mydir"가 "D:\yourdir"을 가리키면, 입력이 symbolic link name의 handle이면, 최종 경로는 "D:\yourdir"를 return한다.

 

2) GetFileInformationByHandleEx

BOOL GetFileInformationByHandleEx(
    HANDLE                    hFile,
    FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
    LPVOID                     lpFileInformation,
    DWORD                    dwBufferSize
);

FileInformationClass가 FILE_STANDARD_INFO이면, NumblerOfLinks 멤버로 해당 파일의 링크의 개수를 확인

FileInformationClass가 FILE_ATTRIBUTE_TAG_INFO이면, FileAttributes와 ReparseTage 멤버를 참조해서 FILE_ATTRIBUTE_SPARSE_FILE 속성과 IO_REPARSE_TAG_SYMLINK or IO_REPARSE_TAG_MOUNT_POINT 값을 확인할 수 있다.

 

기본적으로 mklink / CreateSymbolicLink를 사용해서 링크를 생성

mklink [링크] [원본]

mklink /d \MyFolder \Users\User1\Documents

mklink /j \MyFolder \Users\User1\Documents

mklink /h \MyFile.file \User1\Documents\example.file 하드링크를 생성

mklink \MyFile.file \User1\Documents\example.file 심볼릭 링크를 생성

 

https://docs.microsoft.com/ko-kr/windows-server/administration/windows-commands/mklink

300x250