Windows 시스템 프로그래밍: HardLink 및 SoftLink 생성
10196 단어 systemprogrammingwindowscpp
Linux에 익숙하다면 "symlink"에 대해 들어봤을 것입니다. 절대 또는 상대 경로의 형태로 에 대한 참조를 포함하는 파일 또는 디렉토리의 별칭을 만드는 데 도움이 됩니다. 그러나 Windows에서는 파일에 대해서만 하드 링크를 만들 수 있습니다. 원본 파일을 삭제하더라도 하드 링크된 파일에 계속 액세스할 수 있습니다.
복사된 파일과 하드 링크된 파일의 차이점은 복사된 파일에서 파일의 독립적인 복사본을 얻게 된다는 것입니다. 즉, 두 파일 모두 서로 연결되어 있지 않습니다. 이제 하드 링크 파일에서 하드 링크 파일의 내용을 변경하면 원래 파일에 반영되며 그 반대의 경우도 마찬가지입니다.
CreateHardLinkA 헤더 파일에서 winbase.h 함수를 사용하여 하드링크를 생성할 수 있습니다.
BOOL CreateHardLinkA(
LPCSTR lpFileName,
LPCSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
다음과 같은 기능 매개변수 설명
lpFileName → 새 하드 링크 파일의 이름.
lpExistingFileName → 하드 링크를 생성하려는 기존 파일의 이름.
lpSecurityAttributes → 하드 링크에 대한 보안 속성. 예약되어 있으며
NULL
로 설정해야 합니다.다음은 파일의 하드 링크를 만들기 위한 전체 코드 스니펫입니다.
#include <Windows.h>
#include <string>
#include <iostream>
#include <WinBase.h>
int main(int argc, char**argv)
{
if (argc < 3) {
printf("usage: %s <existing file name> <new file name>\n", argv[0]);
return 1;
}
/**
* https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createhardlinka
*/
BOOL hlBool = CreateHardLinkA(argv[2], argv[1], NULL);
if (hlBool) {
printf("Hard link created\n");
return 0;
}
else {
printf("Error Code: %d\n", GetLastError());
return 1;
}
}
이제 소프트 링크 생성에 대해 알아보겠습니다. 소프트 링크(symlink라고도 함)는 단순히 파일의 바로 가기입니다(예, 컨텍스트 메뉴를 통해 이미 생성했습니다 :D). 하드링크와 달리 파일과 디렉토리 모두 생성이 가능하며 원본 파일을 삭제하면 소프트링크를 통해 파일에 접근할 수 없다.
CreateSymbolicLinkA에서 winbase.h 함수를 사용하여 심볼릭 링크를 만들 수 있습니다.
BOOLEAN CreateSymbolicLinkA(
LPCSTR lpSymlinkFileName,
LPCSTR lpTargetFileName,
DWORD dwFlags
);
다음과 같은 기능 매개변수 설명
lpSymlinkFileName → 생성할 심볼릭 링크의 경로
lpTargetFileName → 생성할 심볼릭 링크의 타겟 경로
dwFlags → 이것은 링크 대상
lpTargetFileName
이 디렉토리인지 여부를 나타냅니다.0x0
→ 링크 대상이 파일입니다. 0x1
→ 링크 대상이 디렉토리입니다. 다음과 같이 코드를 완성하십시오
#include <Windows.h>
#include <string>
#include <iostream>
#include <WinBase.h>
#include <fileapi.h>
#define print printf
int main(int argc, char** argv) {
if (argc < 3) {
printf("usage: %s <existing file name> <new file name>\n", argv[0]);
return 1;
}
DWORD flags = 0x0; // flag for creating symlink of a file
if (GetFileAttributesA(argv[1]) == FILE_ATTRIBUTE_DIRECTORY) {
print("dir");
flags = SYMBOLIC_LINK_FLAG_DIRECTORY; // flag for creatng symlink of directory
}
/**
* https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createsymboliclinka
*/
BOOLEAN slBool = CreateSymbolicLinkA(argv[2], argv[1], flags);
if (slBool) {
printf("Symlink created\n");
return 0;
}
else {
DWORD err = GetLastError();
if (err == 1314) {
printf("Try again with administrator account\n");
return 1;
}
printf("Error Code: %d\n", err);
return 1;
}
}
참고 관리자 계정으로 프로세스를 실행하지 않고 소프트 링크를 생성하려면
dwFlags
값을 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
로 설정할 수 있습니다. 이 플래그를 사용하기 전에 developer mode을 활성화해야 합니다.이 게시물을 읽어 주셔서 감사합니다. 링크를 따라 나에게 연락하십시오
Reference
이 문제에 관하여(Windows 시스템 프로그래밍: HardLink 및 SoftLink 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tbhaxor/windows-system-programming-creating-hardlinks-and-softlinks-3bk4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)