안녕하세요 여러분~
오늘은 win32 기능 중 ,
혹은 프로그램에도 있는 파일, 폴더의 만든날짜, 수정한 날짜, 액세스한 날짜를 수정하는 소스 코드해 애해 알려드릴게요~
기본적인 소스코드는 검색하면 win32 설명서에 나와있습니다. 하지만, 세부적인 인자값에 따라 에러가 날 수 있습니다.
자 먼저 함수 코드를 작성해보겠습니다.
HANDLE pHFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_WRITE_ATTRIBUTES, NULL);
if (pHFile != INVALID_HANDLE_VALUE)
{
FILETIME ft;
SYSTEMTIME st;
BOOL f;
GetSystemTime(&st); // Gets the current system time
SystemTimeToFileTime(&st, &ft); // Converts the current system time to file time format
f = SetFileTime(pHFile, // Sets last-write time of the file
(LPFILETIME)NULL, // 만든날짜를 인자대로 수정
(LPFILETIME)NULL, // 액세스한 날짜를 인자대로 수정
&ft); // 수정한 날짜를 인자대로 수정
CloseHandle(pHFile);
return f;
}
함수는 아주 간단합니다.
이때 가장 주의해야 할점은 HANDLE pHFile = CreateFile( 어쩌구); 이부분 입니다.
사실 밑에 코드야 딱 보면 뭔말인지 아시겠지만,
win32 기능중 HANDLE 구조체의 선언부분을 알아야 자유롭게 해당 함수 사용 및 응용하실 수 있습니다.
CreateFile 인자에는 여러가지가 있습니다. 저도 다 외우진 못하지만, 기억나는 대로 적어볼게요~
CreateFile ( 파일이름(경로), 접근방식(읽기, 쓰기), 공유모드(내가작업중에 누가 접근가능하게 하는지), 보안(알면 쓰곰 모르면 NULL), 파일생성유무, 파일속성(파일의 권한을 설정해 주는것 같아요), 복사 유무(알면쓰고 모르면 NULL));
대중 이렇게 돼있습니다.
파일이름은 당연히 경로구요~
접근방식 : 읽기 쓰기가 있으나, | 로 동시 사용이 가능합니다. 지금처첨 정보 수정을 위해서는 위 소스처럼 둘다사용해야 합니다.
공유모드 : 0 으로 하면 될겁니다. 제가 수정중에 다른사람이 수정못하게요~
보안 : 전잘몰라서 그냥 NULL 했습니다.
파일생성 유무 : 이부분도 중요합니다. 위 소스코드의 인자는 존재하면 수정하고 없으면 에러를 내보내는 기능의 인자이고 다른 기능의 인자들이 있으니 아래 자세한 설명에서 참고 바랍니다.
파일 속성 : 이부분은 파일의 권한을 잠시 바꾸는 건지 자세히 모르지만, 위 인자처럼 중간에 WRITE 가 아닌 값을 넣으면 에러가 발생했었습니다. (에러가 팅기는게 아니라 성공하지 못하는 뜻..)
복사 유무 : 이건 그냥 NULL로 했습니다.
파일의 만든 날짜, 액세스한 날짜, 수정한 날짜 만 수정하실 생각이시면 그냥 제가 제공한 소스코드의 CreateFile함수 인그대로 쓰시고 1번째인자인 파일으름(경로)만 바꿔서 쓰시면 됩니다.
그럼 다음엔 더 좋은 정보로 포스팅 하겠습니다~
각 인자별 자세한 설명은 아래 참조글에서 보시면 될것같습니다~
아래 글은
출처 : MSDN 97 에서 따온 설명입니다.
HANDLE CreateFile(
LPCTSTR lpFileName, // 파일의 이름에 대한 포인터
DWORD dwDesiredAccess, // 접근(read-write) 모드
DWORD dwShareMode, // 공유 모드
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성에 대한포인터
DWORD dwCreationDisposition, // 생성하는 방식
DWORD dwFlagsAndAttributes, // 파일 속성
HANDLE hTemplateFile // 복사하기 위한 속성을 가진 파일의 핸들
);
Parameters
lpFileName생성하거나 열기 위한 개체(file, pipe, mailslot, communications resource, disk device, console, or directory)의 이름을 지정하는 NULL 종료 문자열에 대한 포인터
만약 lpFileName이 경로라면, 기본적인 문자열 크기는 MAX_PATH로 제한된다. 이 한계는 CreateFile 함수가 경로를 분해하는 방식과 관련이 있다.
Windows NT: CreateFile 의 확장(W) 버전을 호출하거나 경로에 "\\?\"를 달아서(? prepending) MAX_PATH개보다 많은 문자를 경로로 사용할 수 있다. "\\?\"는 함수에 경로 분해(parsing)를 하지 말라고 통보한다. 이것은 32,000 개 정도의 유니코드 문자를 경로로 사용할 수 있게 해 준다. 그러나 경로의 각 컴포넌트들은 MAX_PATH 문자보다 많을 수 없다. 이 기법을 사용하기 위해서는 경로를 완전히 작성해야만 한다. 이것은 UNC 이름과 함께 작동하기도 한다. "\\?\"는 경로의 일부로서 무시된다. 예를 들어서 "\\?\C:\myworld\private"는 "C:\myworld\private"와 같이 처리되며, "\\?\UNC\tom_1\hotstuff\coolapps"는 "\\tom_1\hotstuff\coolapps"로 처리된다.
dwDesiredAccess개체에 대한 접근 유형을 지정한다. 응용프로그램은 읽기 접근, 쓰기 접근, 읽기-쓰기 접근, 또는 장치 질의 접근(device query access)을 획득할 수 있다. 이 인자들은 다음값들의 조합일 수 있다.
ValueMeaning
0 | 개체에 대한 장치 질의 접근을 지정한다. 응용프로그램은 장치에 접근하지 않고도 장치에 속성을 질의할 수 있다. |
GENERIC_READ | 개체에 읽기 접근을 지정한다. 파일로부터 읽어들일 수 있으며, 파일 포인터는 이동될 수 있다. GENERIC_WRITE와 읽기-쓰기 접근을 위해 혼용된다. |
GENERIC_WRITE | 개체에 대한 쓰기 접근을 지정한다. 파일로부터 읽어들일 수 있으며, 파일 포인터는 이동될 수 있다. GENERIC_READ와 읽기-쓰기 접근을 위해 혼용된다. |
dwShareMode개체가 공유될 수 있는 방식을 지정하는 비트 플래그를 설정한다. 만약 dwShareMode가 0이면, 이 개체는 공유될 수 없다. 핸들이 닫힐 때까지 그 개체에 대한 연속되는 열기 연산은 실패할 것이다.
개체를 공유하기 위해서는 다음 값들 중의 하나 이상에 대한 조합을 사용해야 한다:
ValueMeaning
FILE_SHARE_DELETE | Windows NT: 삭제 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다 |
FILE_SHARE_READ | 읽기 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다 |
FILE_SHARE_WRITE | 쓰기 접근이 요청되었을 때만 개체에 대한 연속되는 열기 연산이 성공할 것이다 |
lpSecurityAttributes자식 프로세스에 의해서 상속될 수 있는 반환 핸들이 무엇인지를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터. 만약 lpSecurityAttributes가 NULL 이면, 그 핸들은 상속될 수 없다.
Windows NT: 이 구조체의 lpSecurityDescriptor 멤버는 개체에 대한 보안 기술자(security descriptor)를 지정한다. 만약 lpSecurityAttributes가 NULL 이면 개체는 기본 보안 기술자를 얻는다. 대상 파일 시스템이 반드시 파일과 디렉토리에 대한 보안을 지원해야지만, 이 인자는 파일에서 효력을 가질 수 있다.
dwCreationDisposition파일이 존재할 때와 존재하지 않을 때 어떻게 해야할지를 지정한다. 이 인자에 대한 더 많은 정보를 원한다면, Remarks 섹션을 참조하라. 이 인자는 반드시 다음 값들 중의 하나여야만 한다:
ValueMeaningCREATE_NEWCREATE_ALWAYSOPEN_EXISTING
새로운 파일을 생성한다. 지정된 파일이 이미 존재하면 이 함수는 실패한다. | |
새로운 파일을 생성한다. 만약 그 파일이 존재하면, 함수는 파일을 덮어쓰고, 현존하는 속성을 초기화한다. | |
파일을 연다. 파일이 존재하지 않으면 함수는 실패한다. | |
콘솔(console)을 포함한 장치에 대해 CreateFile 함수를 사용하고 있을 때, OPEN_EXISTING 플래그를 사용해야만 하는 이유에 대한 논의를 위해서는 Remarks 섹션을 참조하라. | |
OPEN_ALWAYS | 만약 존재한다면 파일을 연다. 만약 파일이 존재하지 않으면, 함수는 마치 dwCreationDisposition이 CREATE_NEW였던 것처럼 새로운 파일을 생성한다. |
TRUNCATE_EXISTING | 파일을 연다. 한번 열리면 그 파일은 끊어지고(truncated) 그것의 크기는 0 바이트가 된다. 그 호출 프로세스는 적어도 GENERIC_WRITE 접근과 함께 파일을 열어야만 한다. 함수는 파일이 존재하지 않을 때 실패한다. |
dwFlagsAndAttributes파일에 대한 파일 속성과 플래그를 지정한다.
FILE_ATTRIBUTE_NORMAL을 오버라이드하는 모든 파일을 제외하고는, 다음 속성중의 하나의 조합이 dwFlagsAndAttributes 인자를 위해 접근 가능하다(원문 : Any combination of the following attributes is acceptable for the dwFlagsAndAttributes parameter, except all other file attributes override FILE_ATTRIBUTE_NORMAL. )
AttributeMeaning
FILE_ATTRIBUTE_ARCHIVE | 파일은 압축(archive)되어야만 한다. 응용프로그램은 이 속성을 사용하여 백업이나 제거를 위해 파일에 표기(mark)한다. |
FILE_ATTRIBUTE_HIDDEN | 파일은 숨겨져야 한다. 순차적인 디렉토리 열거(ordinary directory listing)에 포함되지 않는다. |
FILE_ATTRIBUTE_NORMAL | 파일은 다른 속성 집합을 가지지 않는다. 이 속성은 혼자서 사용될(used alone) 때만 유효하다. |
FILE_ATTRIBUTE_OFFLINE | 파일의 데이터를 즉시 이용할 수가 없다. 오프라인 저장소에 물리적으로 이동된 파일 데이터를 지정한다. |
FILE_ATTRIBUTE_READONLY | 파일은 읽기 전용이다. 응용프로그램은 그 파일을 읽을 수 있으나, 읽거나 삭제할 수 없다. |
FILE_ATTRIBUTE_SYSTEM | 파일은 운영체제의 일부이거나, 배타적으로 사용된다. |
FILE_ATTRIBUTE_TEMPORARY | 임시 저장을 위해 사용되고 있는 파일이다. 파일 시스템은 데이터를 대량 저장소로 한 번에 보내는 것보다 더 빠른 접근을 위해 메모리의 데이터 모두를 유지하려고 시도한다.(원문 ; File systems attempt to keep all of the data in memory for quicker access rather than flushing the data back to mass storage.) 임시 파일은 더 이상 필요가 없어지면 응용프로그램에 의해 제거되어야만 한다. |
다음 플래그들의 어떠한 조합이라도 dwFlagsAndAttributes 인자에 대해 이용 가능하다.
FILE_FLAG_WRITE_THROUGH | |
즉각적인 캐쉬를 통해서 쓰거나 직접 디스크로 갈 것을 시스템에 명령한다. 시스템은 여전히 쓰기 연산을 캐싱(역자주 : 빠른 연산을 위해 저장하는 기법 중 하나, cache)할 수 있지만, 그것들을 느리게 플러쉬(역자주 : 한꺼번에 이동시키는 것, flush)할 수는 없다.원문 : Instructs the system to write through any intermediate cache and go directly to disk. The system can still cache write operations, but cannot lazily flush them. | |
FILE_FLAG_OVERLAPPED | |
시스템에 개체를 초기화할 것을 명령한다. 그래서 처리를 위해서 의미있는 시간을 취하는 연산은 ERROR_IO_PENING을 반환한다. 연산이 끝나면, 지정된 이벤트는 신호화된 상태(signaled state)로 설정된다.원문 : Instructs the system to initialize the object, so that operations that take a significant amount of time to process return ERROR_IO_PENDING. When the operation is finished, the specified event is set to the signaled state. | |
FILE_FLAG_OVERLAPPE 를 지정했다면, 함수를 읽고 쓰는 파일은 반드시 OVERLAPPE 구조체를 지정해야만 한다. 즉, FILE_FLAG_OVERLAPPED가 지정되면, 응용프로그램은 중복된 읽기와 쓰기를 수행해야만 한다.원문 : When you specify FILE_FLAG_OVERLAPPED, the file read and write functionsmust specify an OVERLAPPED structure. That is, when FILE_FLAG_OVERLAPPED is specified, an application must perform overlapped reading and writing. | |
FILE_FLAG_OVERLAPPED 가 지정되면, 시스템은 파일 포인터를 유지하지 않는다. 파일 위치는 반드시 lpOverlapped 인자의 일부로서 함수를 읽거나 쓰는 파일에 넘겨져야 한다. | |
이 플래그는 핸들에 유사하게 수행되는 하나 이상의 연산을 가능하게 한다(예를 들어, 유사한 읽기와 쓰기 연산)원문 : This flag also enables more than one operation to be performed simultaneously with the handle (a simultaneous read and write operation, for example). | |
FILE_FLAG_NO_BUFFERING | |
명령어는 시스템에 즉각적인 버퍼링이나 캐싱을 수행하지 않고서 파일을 열것을 명령한다. FILE_FLAG_OVERLAPPED와 조합되면, 이 플래그는 최대한의 비동기 수행을 제공한다. 왜냐하면 I/O는 메모리 관리자가 동기화 연산에 의지하지 않기 때문이다. 그러나 어떠한 I/O 연산은 더 오래 걸릴 수 있다. 왜냐하면 데이터가 캐쉬에 저장되지 않기 때문이다.FILE_FLAG_NO_BUFFERING으로 열린 파일로 작업하기 위해서 응용프로그램은 반드시 특정 요구를 만나야 한다.
응용프로그램은 GetDiskFreeSpace 함수를 호출함으로써 볼륨의 섹터 크기를 결정할 수 있다. |
|
FILE_FLAG_RANDOM_ACCESS | |
불규칙하게 접근된 파일을 지정한다. 시스템은 이 플래그를 파일 캐싱을 최적화하기 위한 계기(hint)로 사용할 수 있다. | |
FILE_FLAG_SEQUENTIAL_SCAN | |
처음부터 끝까지 순차적으로 접근된 파일을 지정한다. 시스템은 이 플래그를 파일 캐싱을 최적화하는 계기로 사용할 수 있다. 만약 응용프로그램이 파일 포인터를 임의 접근을 위해 움직인다면, 최적의 캐싱이 일어나지 않을지도 모른다; 그러나 정확한 연산은 여전히 보장된다. | |
이 플래그를 지정하는 것은 응용프로그램이 큰 크기의 파일을 순차 접근을 사용해서 읽어들일때 수행성을 증가시킬 수 있다. 수행성 획득은 대부분 순차적인 큰 파일을 읽어들이는 응용프로그램에 대해서 더욱 중요하다. 그러나 가끔 작은 크기의 바이트를 건너 뛰는 경우가 있다. | |
FILE_FLAG_DELETE_ON_CLOSE | |
자신에 대한 모든 핸들이 닫힌 이후에 즉시 파일을 제거하라고 운영체제에 명령한다. FILE_FLAG_DELETE_ON_CLOSE라고 지정한 파일 핸들을 제거하라는 것은 아니다. 그 파일에 대한 연속되는 열기 요청은 FILE_SHARE_DELETE가 사용되지 않으면 실패할 것이다. 원문 : Indicates that the operating system is to delete the file immediately after all of its handles have been closed, not just the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE. Subsequent open requests for the file will fail, unless FILE_SHARE_DELETE is used. |
|
FILE_FLAG_BACKUP_SEMANTICS | |
Windows NT: 파일이 백업이나 재저장 연산을 위해 열리거나 생성되어야 한다고 명령한다. 운영체제는 호출 프로세스가 필요한 권한을 가지는 파일 보안 체크를 재정의하게 한다. 적절한 권한은 SE_BACKUP_NAME과 SE_RESTORE_NAME이다.이 플래그를 설정해서 디렉토리의 핸들을 획득할 수도 있다. 디렉토리 핸들은 파일 핸들을 대신해 특정 Win32 함수에 넘겨질 수 있다. 원문 : Indicates that the file is being opened or created for a backup or restore operation. The system ensures that the calling process overrides file security checks, provided it has the necessary privileges. The relevant privileges are SE_BACKUP_NAME and SE_RESTORE_NAME. You can also set this flag to obtain a handle to a directory. A directory handle can be passed to some Win32 functions in place of a file handle. |
|
FILE_FLAG_POSIX_SEMANTICS | |
파일이 POSIX 규칙을 적용해 접근될 수 있도록 명령한다. This includes allowing multiple files with names, differing only in case, for file systems that support such naming. 이 옵션을 사용할 때는 주의를 기울여야 하는데, 이 플래그로 생성된 파일은 MS-DOS나 16비트 윈도우에서 작성된 응용프로그램을 통해서는 접근하지 못할 수도 있기 때문이다. | |
FILE_FLAG_OPEN_REPARSE_POINT | |
이 플래그를 지정하면 NTFS 분석 포인트(NTFS reparse points)의 분석 동작(reparse behavior)을 방해한다. 파일이 열릴 때, 분석 포인트를 제어하는 필터가 선택적이든 필수적이든간에 파일 핸들이 반환된다. 이 플래그는 CREATE_ALWAYS 플래그와 함께 사용될 수 없다. 원문 : Specifying this flag inhibits the reparse behavior of NTFS reparse points. When the file is opened, a file handle is returned, whether the filter that controls the reparse point is operational or not. This flag cannot be used with the CREATE_ALWAYS flag. |
|
FILE_FLAG_OPEN_NO_RECALL | |
파일 데이터가 요청되지만, 원격 저장소에 계속 저장되어야만 함을 지시한다. 로컬 저장소로 다시 이동될 수는 없다. 이 플래그는 원격 저장소 시스템(remote sotrage system)이나 계층 저장 관리 시스템(Hierarchical Storage Management system)에 의해 사용된다. |
만약 CreateFile이 클라이언트 측의 named pipe를 열면, dwFlagsAndAttributes 인자는 Security Quality of Service 정보를 포함할 수도 있다. 더 많은 정보를 원한다면 Impersonation Levels를 참조하라. SECURITY_SQOS_PRESENT 플래그를 지정하는 응용프로그램을 호출할 때, dwFlagsAndAttributes 인자는 다음 값 중 하나 이상을 포함할 수 있다:
ValueMeaning
SECURITY_ANONYMOUS | 클라이언트를 Anonymous(익명) impoersonation level로 흉내내라고 지정한다.원문 : Specifies to impersonate the client at the Anonymous impersonation level. |
SECURITY_IDENTIFICATION | 클라이언트를 Identification(증명) impersonation level로 흉내내라고 지정한다.원문 : Specifies to impersonate the client at the Identification impersonation level. |
SECURITY_IMPERSONATION | 클라이언트를 Impersonation(대역) impersonation level로 흉내내라고 지정한다.원문 : Specifies to impersonate the client at the Impersonation impersonation level. |
SECURITY_DELEGATION | 클라이언트를 Delegation(대표) impersonation level로 흉내내라고 지정한다.원문 : Specifies to impersonate the client at the Delegation impersonation level. |
SECURITY_CONTEXT_TRACKING | 보안 추적 모드(Security Tracking Mode)가 동적(dynamic)임을 지정한다. 만약 이 플래그가 지정되어 있지 않으면, 보안 추적 모드는 정적이다. |
SECURITY_EFFECTIVE_ONLY | 클라이언트 보안 문맥(context)의 가능한 양상(aspect)만을 서버에 지정한다. 만약 이 플래그를 지정하지 않으면, 모든 클라이언트 보안 문맥의 양상이 이용가능해진다.이 플래그는 서버가 클라이언트를 흉내내고 있는 동안 사용할 수 있는 그룹과 권한을 클라이언트가 제한할 수 있도록 허용한다. 원문 : Specifies that only the enabled aspects of the client's security context are available to the server. If you do not specify this flag, all aspects of the client's security context are available. This flag allows the client to limit the groups and privileges that a server can use while impersonating the client. |
hTemplateFile템플릿 파일에 대해 GENERIC_READ 접근을 가지는 핸들을 지정한다. 템플릿 파일은 생성되고 잇는 파일에 대한 파일 속성과 확장 속성을 제공한다.
Windows 95: hTemplateFile 인자는 NULL이어야만 한다. 만약 핸들을 제공하면, 호출은 실패하고 GetLastError은 ERROR_NOT_SUPPORTED를 반환한다.
출처: https://dpdpdpdpdpdp.tistory.com/239 [dp.]
출처: https://dpdpdpdpdpdp.tistory.com/239 [dp.]
'IT기술(코딩) > C, C++' 카테고리의 다른 글
C# design Form 에서 ZMQ 통신 하기 Client (0) | 2022.06.16 |
---|---|
C++ MFC 10진법, 16진법 변환 (0) | 2022.05.23 |
C++, C# zmq.hpp 통신 예제 socket.send, socket.recv, client.SendFrame, client.ReceiveFrameString (0) | 2022.04.13 |
C++, MFC 현재 프로젝트, 실행파일 실행한 경로 가져오기. (1) | 2022.01.19 |
MFC 출력 값 log표출 하기 안드로이드 스튜디오 log.d() 처럼 콘솔창에 debug값 출력하기, 테스트 값 확인하기 (0) | 2021.12.08 |