4-1 파일 기본 (과제-1)
과제-1 PrintName() 동적할당 문자열 free 수정필요
과제-2 chmod() 함수가 결과적으로 적용되지 않음 ... ch_mod 프로그램 진행중
과제 - 1
fileinfo
#include <stdio.h>
#include <sys/stat.h> //lstat
#include <stdlib.h> //malloc, free
#include <string.h> //strcpy
#include <unistd.h> //readlink
enum { COUNT_ERROR = -2, LSTAT_ERROR = -1 };
char* my_strtok(char* str, const char* delim)
{
static char* str_copy = NULL;
char* delim_copy = NULL;
(str!=NULL) ? (str_copy=str) : (str=str_copy);
if (*str_copy=='\0')
return NULL;
while (*str_copy){
delim_copy = (char*)delim;
while (*delim_copy){
if (*str_copy == *delim_copy){
*str_copy = '\0';
str_copy++;
return str;
}
delim_copy++;
}
str_copy++;
}
return 0;
// return str; //맨마지막 구분자 뒤의 문자열을 출력하지 않기 위해 my_strtok 함수 사용
}
char* PrintName(char* path)
{
int j = 0;
char* name = malloc(sizeof(path));
if (path != NULL) {
strcpy(name, path);
name = strrchr(name, '/');
}
for (int i = 0; i < (int)strlen(name); i++)
if (name[i] != '/')
name[j++] = name[i];
name[j] = '\0';
return name;
}
int main(int argc, char* argv[])
{
if (argc != 2) {
puts("하나의 파일을 입력해주세요.");
return COUNT_ERROR;
}
struct stat file;
if (lstat(argv[1], &file) == -1) {
puts("파일을 읽을 수 없습니다.");
return LSTAT_ERROR;
}
/* 파일 경로 */
char* path = malloc(sizeof(argv[1]));
if (argv[1] != NULL)
strcpy(path, argv[1]);
printf("path: ");
char* temp = my_strtok(path, "/");
while (temp != NULL) {
printf("%s/", temp);
temp = my_strtok(NULL, "/");
}
puts("");
/* 파일명 */
if (argv[1] != NULL)
printf("file name: %s\n", PrintName(argv[1]));
/* 심볼릭 링크일 경우, 원본 파일명 */
if (S_ISLNK(file.st_mode)) {
char buf[256];
memset(buf, 0x00, 256);
readlink(argv[1], buf, 256);
printf("original file name: %s\n", PrintName(buf));
}
printf("inode num: %ld\n", file.st_ino);
printf("user id: %d\n", file.st_uid);
printf("group id: %d\n", file.st_gid);
printf("size: %ld\n", file.st_size);
/* 파일 타입 정보 */
char* type;
if (S_ISREG(file.st_mode))
type = "regular file";
else if (S_ISDIR(file.st_mode))
type = "directory";
else if (S_ISLNK(file.st_mode))
type = "symbolic link";
printf("type: %s\n", type);
/* 파일 모드 정보 */
char mode[12];
memset(mode, '-', sizeof(mode));
int setnum[12] = { 0x800, 0x400, 0x200, 00400, 00200, 00100,
00040, 00020, 00010, 00004, 00002, 00001};
char* setmode = "sgbrwxrwxrwx";
printf("mode: ");
for (int i = 0; i < (int)sizeof(mode); i++) {
if ((file.st_mode & setnum[i]) != 0) {
mode[i] = setmode[i];
printf("%c", mode[i]);
}
else
printf("%c", mode[i]);
}
puts("");
free(path);
return 0;
}
Author And Source
이 문제에 관하여(4-1 파일 기본 (과제-1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@doheeklm/4-1-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)