C++에서 realpath() 함수 구현
-
C++에서
realpath()
함수 구현 -
C++에서
realpath()
함수를 사용하여 절대 경로 찾기 -
한 줄 명령을 사용하여 C++에서
realpath()
함수를 사용하여 절대 경로 찾기 - 결론
realpath()
함수는 POSIX 1997 및 POSIX 2008에서 디렉터리 내부 파일의 절대 경로를 찾는 함수로 처음 문서화되었습니다.
이 기사에서는 C++에서 realpath()
함수의 구현에 대해 설명합니다. C++를 사용하여 파일의 절대 경로를 찾기 위해 시스템에 구현할 수 있습니다.
C++에서 realpath()
함수 구현
C++에서 realpath()
의 주요 용도는 모든 심볼릭 링크가 확인될 때 파일의 경로 이름을 찾는 것입니다.
C++에서 realpath()
구현에 대해 논의하기 전에 알아야 할 몇 가지 기본 개념은 다음과 같습니다.
- 심볼릭 링크: 심볼릭 링크는 대상 파일을 가리키지만 컴퓨터가 심볼릭 링크를 대상 파일에 대한 링크가 아닌 자체 파일로 취급하므로 바로 가기와는 다릅니다. 이것은 액세스할 때 사용자를 원본 파일이 있는 위치로 안내하는 파일 유형의 역할을 하며 심볼릭 링크에 대한 모든 변경 사항도 원본 파일에 반영됩니다.
- 절대 경로: 파일의 경로가
\usr\bin\main
과 같이 루트 디렉터리까지 기록될 때 이를 절대 경로라고 합니다. - 상대 경로: 현재 작업 디렉토리가
usr\bin
으로 설정되어 있으면 절대 경로가/usr/bin/main
인 파일을 단순히 main으로 참조할 수 있습니다. 예를 들어 UNIX 명령:cp /usr/bin/main /usr/bin/main.bak
및 명령:cp mailbox mailbox.bak
는 작업 디렉토리가/usr/ast
인 경우 동일한 작업을 수행합니다.
C++에서 realpath()
함수가 찾은 경로 이름은 제공된 값이 상대 이름인 경우 반드시 절대적일 필요는 없지만 링크 값에 대한 절대 이름으로 심볼릭 링크를 순회하는지 여부에 따라 달라집니다. 그렇다면 출력은 절대 이름입니다.
C++에서 realpath()
함수를 사용하여 절대 경로 찾기
C++에서 realpath()
를 사용하여 파일의 절대 경로를 찾는 프로그램을 만들어 봅시다. 이 예제는 Linux에서 시연됩니다(Windows에서는 구분 기호가 \
임).
-
.cpp
확장자가 있는 Linux 배포판에서 텍스트 편집기를 엽니다. -
프로그램에는 5개의 가져오기 파일이 있습니다.
limits.h
는PATH_MAX
하위 기능을 포함하고,stdio
는 입력-출력 기능을,stdlib
,string
은 문자열 기능을,cerrno
는 오류 사례를 포함합니다. . -
main
함수 내에서 변수가 생성됩니다. 즉, 크기가PATH_MAX
로 설정된 문자 배열buffer[]
입니다.PATH_MAX
를 사용하는 것은 단순히 추측하는 대신 경로 이름을 저장하는 더 좋은 방법입니다. -
C++의
realpath()
는 파일 이름과 확인된 이름의 두 가지 매개 변수를 사용합니다. 확인된 이름에 대한 포인터를 반환합니다. 그렇지 않으면 오류 플래그가 반환됩니다.char *path = realpath("test.py", buffer);
-
C++에서
realpath()
함수에 의해 확인된 이름이 성공적으로 반환되면buffer
변수 내부의 값이 인쇄됩니다.if (path) { printf("Absolute Path = %s.\n", buffer); }
-
realpath()
함수가 널 포인터를 반환하면 프로그램은errno
함수를 사용하여 오류 플래그를 발생시킵니다.char* errStr = strerror(errno);
errno
함수는cerrno
라이브러리의 멤버 함수입니다. 숫자 오류 코드를 반환하지만strerror
함수를 사용하여 해당 문자열 값char* errStr = strerror(errno)
으로 변환합니다. -
perror
는stder
에 오류 메시지를 인쇄합니다. 이 함수는 먼저 중괄호 안에 제공된 텍스트를 인쇄한 다음 오류 메시지를 인쇄합니다.perror("realpath");
-
마지막으로
else
블록 내부의EXIT_FAILURE
종료 코드를 사용하여 프로그램이 종료됩니다.exit(EXIT_FAILURE);
암호:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cerrno>
int main(void) {
char buffer[PATH_MAX];
char* path = realpath("test.py", buffer);
if (path) { // or: if (path != NULL)
printf("Absolute Path = %s.\n", buffer);
} else {
char* errStr = strerror(errno);
printf("String Error: %s\n", errStr);
perror("realpath");
exit(EXIT_FAILURE);
}
return 0;
}
편집:
코드는 Linux로 작성되었으므로 터미널을 사용하여 컴파일해야 합니다. 적절한 이름(예: C-realpath
)과 .cpp
확장자로 코드가 작성된 텍스트 파일을 저장합니다.
파일은 gcc
컴파일러를 사용하여 컴파일되고 코드를 실행하기 위해 새 애플리케이션이 생성됩니다.
아래 구문을 사용하십시오.
gcc -o realpath2 C-realpath.cpp
위 구문은 오류가 없는 한 코드를 성공적으로 컴파일합니다. 일단 컴파일되면 컴파일러는 코드에 대한 출력 애플리케이션인 realpath2
를 생성합니다.
응용 프로그램을 실행하려면 다음 구문을 입력하십시오.
./realpath2
출력:
jay@jay-virtual-machine:~$ gcc -o realpath2 C-realpath.cpp
jay@jay-virtual-machine:~$ ./realpath2
Absolute Path = /home/jay/test.py.
파일 test.py
가 시스템에 존재하므로 프로그램은 절대 경로를 인쇄합니다.
파일에 잘못된 이름이 제공되거나 파일이 누락된 경우 애플리케이션은 오류 코드를 인쇄합니다.
jay@jay-virtual-machine:~$ ./realpath2
String Error: No such file or directory
realpath: No such file or directory
한 줄 명령을 사용하여 C++에서 realpath()
함수를 사용하여 절대 경로 찾기
C++의 realpath()
함수는 Linux의 한 줄 명령으로도 구현할 수 있습니다. 이렇게 하면 프로그래머가 코드를 작성하고 별도로 컴파일하기 위해 텍스트 파일을 만들지 않아도 됩니다.
코드를 컴파일하려면 터미널 내부에 다음 구문을 작성하십시오.
gcc -o realpath -x c - <<< $'#include<stdlib.h>\n#include<stdio.h>\nint main(int c,char**v){puts(realpath(v[1],0));}'
코드의 기능:
gcc -o realpath
는gcc
컴파일러를 사용하여realpath
출력 애플리케이션을 생성합니다.- 코드에는
stdlib
및stdio
라는 두 개의 라이브러리 패키지가 있습니다. main
메서드 내에서 정수 변수c
와 포인터v
라는 두 개의 변수가 생성됩니다.puts(realpath(v[1],0))
는realpath()
함수에서 반환된 문자열 리터럴을 반환합니다.
출력을 생성하려면 출력 애플리케이션 realpath
에 파일 이름 또는 경로를 제공해야 합니다. 이 예제에서는 파일 시스템 내의 폴더가 응용 프로그램에 전달되고 파일의 절대 경로를 반환합니다.
출력:
jay@jay-virtual-machine:~$ ./realpath snap
/home/jay/snap
코드 내부에 오류 예외가 없으므로 입력이 누락된 파일인 경우 오류가 발생합니다.
jay@jay-virtual-machine:~$ ./realpath vid
Segmentation fault (core dumped)
결론
이 기사에서는 C++에서 realpath()
함수를 구현하여 파일의 절대 경로를 찾는 방법을 설명합니다. 기사를 살펴본 후 독자는 C++에서 realpath()
를 사용하여 파일의 절대 경로를 파생할 수 있습니다.