file copy 프로그램 구현
2. Window API
Code
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) {
HANDLE handle;
DWORD FileSize;
DWORD nNumberOfBytesToRead;
char str[300000];
//성공하면 파일의 핸들을 반환, 실패하면 INVALID_HANDLE_VALUE 반환
handle = CreateFile("D:/Test/File1.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//CreateFie
if (handle == INVALID_HANDLE_VALUE) {
printf("Error! Can't open File1\n");
return -1;
}
//파일1의 크기를 반환
FileSize = GetFileSize(handle, NULL);
ReadFile(handle, str, FileSize, &nNumberOfBytesToRead, NULL);
CloseHandle(handle);
//복사할 위치에 화일을 생성후 핸들을 돌려 받는다.
handle = CreateFile("D:/Test/File2.txt",GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle == INVALID_HANDLE_VALUE) {
printf("Error! File2 Already Exists !\n");
return -1;
}
WriteFile(handle, str, FileSize, &nNumberOfBytesToRead, NULL);
CloseHandle(handle);
printf("Copy Success !!\n");
return 0;
}
HINSTANCE hInstance : 현재 실행되고 있는 프로그램의 인스턴스 핸들 HINSTANCE hPreInstance : 바로 앞에 실행된 프로그램의 인스턴스 핸들. 통상 LPSTR lpCmdLine : 명령행 인자. main 함수의 argv에 해당 int nCmdShow : 윈도우를 보여주는 형태의 플래그 일반적인 콘솔 앱과는 달리 main 함수 대신 WinMain이라는 함수가 있다. 콘솔 앱에서 main함수와 같은 프로그램의 진입점(entry point)역할을 한다. WINAPI라고 되어 있는 부분은 해당 함수의 호출 규약(calling convention)을 규정해주는 구문이다. 호출 규약을 지정하지 않으면 C 호출 규약이 기본값으로 지정되게 된다. 윈도우즈 응용프로그램에서는 WINAPI 호출규약을 지정해야 합니다.
CreateFile 매개변수
HANDLE WINAPI CreateFile(
__in LPCTSTR lpFileName, //열고자하는 파일 이름
__in DWORD dwDesiredAccess, //접근 방법 명시, 일반적으로 GENERIC_READ, GENERIC_WRITE
__in DWORD dwShareMode, //0개체 공유 방식 지정, 0을 지정하면 공유할 수 없는 상태가 됨.
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition, //파일 생성방식 명시, CREATE_ALWAYS : 새로운 파일생성, OPEN_EXISTING : 파일이 존재하면 연다.
//만약 파일이나 장치가 존재하지 않으면, 에러코드로 ERROR_FILE_NOT_FOUND(2) ...
__in DWORD dwFlagsAndAttributes, //파일의 기타속성
__in_opt HANDLE hTemplateFile
);
참고 : http://winapi.freetechsecrets.com/win32/WIN32CreateFile.html
file copy 프로그램 구현
과제 개요
2개의 file 이름을 명령 인수로 받아서 첫번째 파일로부터 두번재 파일로 복사하는 프로그램을 POSIX API와 Windows API를 이용하여 작성하시오. 첫번째 파일이 없거나, 두번째 파일이 이미 존재할 경우 적절한 메시지를 출력하고 실행을 중지하시오.
1. POSIX API
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char* argv[]){
char buf[2048];
int fd_in, fd_out;
ssize_t bytes_read, bytes_write;
//wrong input
if(argc != 3){
printf("error! \nwrite cp filename1 filename2\n");
return 1;
}
//input file
fd_in = open(argv[1],O_RDONLY);
if(fd_in == -1){
perror("open error\n");
return 2;
}
//create output file
fd_out = open(argv[2],O_WRONLY | O_CREAT | O_EXCL, 0644);
//chomd 0644, enable to write,read O_EXCL 인자는 O_CREAT와 함께 쓰이면 중복검사 기능을 수행한다.
if(fd_out == -1){
perror("copy failed! check existing filename\n");
return 3;
}
//copy process
while((bytes_read = read(fd_in,&buf,2048)) > 0 ){ // argv[1]'s file bytes
bytes_write = write(fd_out,&buf,(ssize_t)bytes_read);
if(bytes_write != bytes_read){
perror("write error\n");
return 4;
}
}
close(fd_in);
close(fd_out);
return 0;
}
헤더 파일
#include <sys/stat.h> 파일 정보 (통계분석) 등.
#include <sys/types.h> 어떤 곳에서든지 사용되는 다양한 데이터 유형.
#include <unistd.h> 다양한 필수 POSIX 함수와 상수.
main(int argc , char* argv[])
argc : arguments count로서 main 함수에 전달된 인자의 갯수
argv : arguments vector로서 가변 문자열 , 첫번째 문자열은 프로그램의 실행경로로 항상 고정
-------------------------POSIX API----------------------
open()
#include < sys / stat.h >
#include < fcntl.h >
int open (const char * path , int oflag , ...);
oflag :
O_RDONLY
읽기 전용으로 엽니 다.
O_WRONLY
쓰기 전용으로 엽니 다.
O_RDWR
읽기 및 쓰기 용으로 엽니 다. 이 플래그가 FIFO에 적용되면 결과는 정의되지 않습니다.
-----------------------명령어순서---------------------
gcc -Wall -o [출력파일명] [컴파일파일명]
./[출력파일명] srcFile dstFile
복사 완료!
https://ddiri01.tistory.com/76 http://neosrtos.com/docs/posix_api/sysstat.html http://neosrtos.com/docs/posix_api/unistd.html http://theeye.pe.kr/archives/938 http://linux.die.net/man/3/read http://www.techytalk.info/linux-system-programming-open-file-read-file-and-write-file/
네트워크프로그래밍1 There are multiple ways of installing Hydejack. The easiest and cleanest way is via the Starter Kit. Alternatively, you can use the Ruby gem. If you don’t mind a cluttered source directory, you can use the zip file. Finally, If you know what you are doing, you can fork the git repository.
Hydejack v4 adds a lot of social media icons and introduces a new default layout. It also breaks things, hence a new major release number.
Breaking
- Structure of
_config.yml
has changed- Social media usernames are now located under
author: social: <platform>: <username>
. disqus
is now a top-level entry (moved from author
).- Now has
font
, font_accent
and google_fonts
fields that are mandatory.
- Now defaults to the
blog
layout, old style is available via blog-by-tag
layout, see archive.html
.