http://infoki.net/613
SHFILEOPSTRUCT
SHFileOperation 함수가 행하는 파일 조작에 관한 정보가 격납됩니다.
typedef struct _SHFILEOPSTRUCT { HWND hwnd; // 윈도우 핸들 UINT wFunc; // 실행하는 조작 LPCTSTR pFrom; // 대상 파일명 LPCTSTR pTo; // 목적 파일명 FILEOP_FLAGS fFlags; // 플래그 BOOL fAnyOperationsAborted; // 결과 LPVOID hNameMappings; // 파일명 매핑 오브젝트 LPCTSTR lpszProgressTitle; // 다이얼로그의 타이틀 } SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;
멤버
- hwnd
파일 조작의 상황을 표시하는 다이알로그 박스의 오너 윈도우의 핸들을 지정합니다.
- wFunc
실행하는 파일 조작을 나타내는 값을 지정합니다.이하의 값중 한쪽이 격납됩니다.
치 의미 0x0001 (FO_MOVE) pFrom 멤버로 지정된 파일을 pTo 멤버로 지정된 위치로 이동합니다.
0x0002 (FO_COPY) pFrom 멤버로 지정된 파일을 pTo 멤버로 지정된 위치에 카피합니다.
0x0003 (FO_DELETE) pFrom 멤버로 지정된 파일을 삭제합니다.
0x0004 (FO_RENAME) pFrom 멤버로 지정된 파일의 이름을 pTo 멤버로 지정된 파일명으로 변경합니다.이 플래그를 사용하고, 한 번의 함수 호출로 복수의 파일의 이름을 변경할 수 없습니다.복수의 파일의 이름을 변경하려면 FO_MOVE 플래그를 사용합니다.
- pFrom
조작의 대상이 된다1개이상의 파일명이 격납된 버퍼의 주소를 지정합니다.이러한 파일명은 풀 패스 지정되어 있지 않으면 안됩니다.파일명에 “*” 등의, 표준MS-DOS와일드 카드를 지정할 수 있습니다.
각각의 파일명은1개의 눌 문자로 단락지어지지 않으면 안됩니다.또, 마지막 파일명의 뒤에는2개의 눌 몬지를 들어갈 수 있지 않으면 안됩니다.
- pTo
카피·이동처 디렉토리명 또는 변경 후의 파일명이 격납된 버퍼의 주소를 지정합니다.이 멤버를 사용하지 않는 경우에는 0 (NULL) (을)를 지정하지 않으면 안됩니다.
카피 또는 이동의 조작에 대하고, pFrom 멤버와 같은 방법으로 복수의 파일을 지정할 수 있습니다.이 경우, 각각의 파일명은1개의 눌 문자로 단락지어, 마지막 파일명의 뒤에는2개의 눌 몬지를 들어갈 수 있지 않으면 안됩니다.복수의 파일명을 지정하려면 , fFlags멤버에 FOF_MULTIDESTFILES 플래그를 지정합니다.
카피 또는 이동의 조작에 대하고, 존재하지 않는 디렉토리를 지정할 수 있습니다.이 때, 시스템은 디렉토리의 작성을 시도합니다만, 통상은, 다이알로그 박스를 표시해 새로운 디렉토리를 작성할지를 유저에게 확인합니다.파일 조작중에 다이알로그 박스를 표시하지 않게 하려면 , fFlags 멤버에 FOF_NOCONFIRMMKDIR 플래그를 지정합니다.
파일명에 와일드 카드 문자를 사용할 수 없습니다.또, 파일명은 풀 패스 지정되어 있지 않으면 안됩니다.상대 패스를 사용하면, 예기치 않은 결과를 일으킬 가능성이 있습니다.
- fFlags
파일 조작을 제어하는 옵션 플래그를 지정합니다. 0 또는 이하의 값을 조합해 지정합니다.
치 의미 0x0001 (FOF_MULTIDESTFILES) pTo 멤버가 복수의 파일명을 지정해 있는 것을 나타냅니다.
0x0002 (FOF_CONFIRMMOUSE) 현재는 사용되지 않습니다.
0x0004 (FOF_SILENT) 경과를 나타내는 다이알로그 박스를 표시하지 않습니다.
0x0008 (FOF_RENAMEONCOLLISION) 이동, 카피, 이름의 변경의 조작에 대하고, 지정한 파일명이 벌써 존재하고 있었을 경우에는, 조작 대상의 파일에 새로운 이름을 붙입니다.
0x0010 (FOF_NOCONFIRMATION) 표시되는 다이알로그 박스로 「네」또는 「모두」를 선택하도록(듯이) 합니다.
0x0020 (FOF_WANTMAPPINGHANDLE) FOF_RENAMEONCOLLISION 하지만 지정되어 있고, 같은 파일명이 존재했기 때문에 새로운 파일명이 붙여졌을 경우에, 낡은 이름과 새로운 이름을 포함한 매핑 오브젝트의 핸들을hNameMappings 멤버에 격납합니다.
0x0040 (FOF_ALLOWUNDO) 가능한 한 un-do 정보를 보관 유지하도록(듯이) 합니다. pFrom 그리고 지정된 파일명이 풀 패스로 지정되어 있을 필요가 있습니다.삭제시로 지정하면, 파일을 쓰레기통에 넣을 수 있습니다.
0x0080 (FOF_FILESONLY) 와일드 카드 파일명(*.*)(이)가 지정되었을 경우에게만 조작을 실행합니다.
0x0100 (FOF_SIMPLEPROGRESS) 경과를 나타내는 다이알로그 박스에 파일명을 표시하지 않습니다.
0x0200 (FOF_NOCONFIRMMKDIR) 새로운 디렉토리를 작성할 필요가 있는 경우에, 작성할지의 확인을 하지 않습니다.
0x0400 (FOF_NOERRORUI) 에러가 발생했을 경우에, 유저 인터페이스를 표시하지 않습니다.
0x0800 (FOF_NOCOPYSECURITYATTRIBS) Version 4.71 이후: 파일의 시큐러티 속성이 카피되지 않게 합니다.
0x1000 (FOF_NORECURSION) 로컬 디렉토리에만 조작을 행합니다.서브 디렉토리에 대해서 재귀적으로 조작을 행하지 않습니다.
0x2000 (FOF_NO_CONNECTED_ELEMENTS) Windows Me/2000 이후: 그룹으로서 접속되고 있는 파일을 이동하지 않습니다.지정된 파일만을 이동합니다.
0x4000 (FOF_WANTNUKEWARNING) Windows Me/2000 이후: 쓰레기통에 넣는 것은 아닌 삭제 조작 시에 파일이 삭제될 때 경고를 합니다.
0x8000 (FOF_NORECURSEREPARSE) Windows XP 이후: 리파스포인트를 컨테이너는 아니고 오브젝트로서 취급합니다.
- fAnyOperationsAborted
지정한 파일 조작이 완료하기 전에 유저에 의해서 중지되었을 경우에는 1 (TRUE) 하지만 격납됩니다.그 이외의 경우에는 0 (FALSE) 하지만 격납됩니다.
- hNameMappings
이동·카피·이름 변경된 파일의 낡은 파일명과 새로운 파일명을 포함한 파일명 매핑 오브젝트의 핸들이 격납됩니다.이 멤버는 fFlags멤버에 FOF_WANTMAPPINGHANDLE 플래그가 지정되었을 경우에게만 사용됩니다.이 핸들이 불필요하게 되면SHFreeNameMappings 함수로 해방하지 않으면 안됩니다.이 핸들에 관해서는, 아래의 해설을 참조해 주세요.
- lpszProgressTitle
경과를 표시하는 다이알로그 박스의 타이틀 바에 사용하는 문자열의 주소를 지정합니다. fFlags 멤버로 FOF_SIMPLEPROGRESS 하지만 지정되어 있는 경우에게만 유효합니다.
해설
pFrom 멤버 및 pFrom 멤버가 풀 패스가 아닌 파일명의 경우는, 커런트 디렉토리에 있다고 보입니다.
파일 삭제시에 pFrom 멤버에 풀 패스가 아닌 파일명이 지정되었을 경우는, FOF_ALLOWUNDO 플래그를 지정했을 경우에서도 파일은 쓰레기통에 넣어지지 않습니다.
fFlags 멤버에 FOF_WANTMAPPINGHANDLE 플래그를 지정하면, hNameMappings 멤버에는 파일명 매핑 오브젝트의 핸들이 격납됩니다.이 핸들은, 멤버가 UINT 형태 및 SHNAMEMAPPING 구조체의 배열에의 포인터인 구조체의 포인터로서 취급됩니다.즉,
struct HANDLETOMAPPINGS { UINT uNumberOfMappings; // 배열의 요소수 SHNAMEMAPPING *lpSHNameMapping; // 배열에의 포인터 };
그렇다고 하는 구조체에의 포인터이다고 합니다(이 HANDLETOMAPPINGS 구조체는 명시적으로 정의되고는 있지 않습니다).이 때의UINT 형태의 값으로서 SHNAMEMAPPING 구조체의 배열의 요소수가 세트 됩니다.각각의 SHNAMEMAPPING 구조체에는, 변경되었다1개의 파일이 낡은 패스명 및 새로운 패스명이 격납되고 있습니다.
hNameMappings 멤버의 값으로 해서 취득한 핸들은 SHFreeNameMappings 함수를 사용해 해방하지 않으면 안됩니다.
hNameMappings 멤버에 돌려주어지는 파일명 매핑 오브젝트를 참조하는 경우, Windows 95/98/Me 그럼, SHFileOperation 함수는 ANSI 세트의 SHNAMEMAPPING 구조체를 돌려줍니다만,Windows NT/2000/XP 그럼, SHFileOperation 함수는 ANSI 판의 함수 및 Unicode 판의 함수 모두 Unicode 세트의 SHNAMEMAPPING 구조체를 돌려줍니다.따라서, 모든 버젼의 Windows 그리고 조작시키기 위해서는, Windows 의 버젼을 조사해 조건 나누어 하는 코드를 작성할 필요가 있습니다.
대응 정보
Shell32.dll Version 4.00 이후
Windows 95 이후 / Windows NT 4.0 이후
변수와의 대응
HSP 변수 | 멤버 | ||
---|---|---|---|
멤버명 | 오프셋 | 사이즈 | |
shfo.0 | hwnd | 0 | 4 |
shfo.1 | wFunc | 4 | 4 |
shfo.2 | pFrom | 8 | 4 |
shfo.3 | pTo | 12 | 4 |
shfo.4 | fFlags | 16 | 4 |
shfo.5 | fAnyOperationsAborted | 20 | 4 |
shfo.6 | hNameMappings | 24 | 4 |
shfo.7 | lpszProgressTitle | 28 | 4 |
출처 : http://blog.naver.com/wjfeo42?Redirect=Log&logNo=30003505246
http://blog.naver.com/ollbback?Redirect=Log&logNo=120040302994
파일 복사, 삭제, 이동 파일명 변경등을 지원하는 함수로써 윈도우 파일 익스플로어 에서 뜨는
파일 전송 이미지가 나오는 다이얼로그를 띄울수 있다는 점.......
int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
Parameter SHFILEOPSTRUCT
http://blog.naver.com/imanoos/35359421
SHFILEOPSTRUCT를 이용해서 폴더를 이동시킬 때 주의점
SHFILEOPSTRUCT shop= {0};
shop.hwnd = NULL;
shop.wFunc = FO_MOVE; //FO_COPY
shop.pFrom = strSource;
shop.pTo = strDest;
// shop.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_MULTIDESTFILES;
shop.fAnyOperationsAborted = false;
shop.hNameMappings = NULL;
shop.lpszProgressTitle = "데이타 이동";
SHFileOperation(&shop);
보통 위와 같이 초기화를 시키는데, 이 때 shop.pFrom 및 shop.pTo 부분에 들어가는 마지막 문자열은 항상 NULL로 끝나야 한다.
예)
TCHAR pszPath[1024];
ZeroMemory(&pszPath, sizeof(TCHAR)*1024);
strcpy(pszPath, strPath);
[출처] SHFILEOPSTRUCT를 이용해서 폴더를 이동시킬 때 주의점 |작성자 수나미
[출처] SHFILEOPSTRUCT를 이용해서 폴더를 이동시킬 때 주의점 |작성자 수나미
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
마우스 이벤트 강제발생 (0) | 2012.11.01 |
---|---|
CreateDirectory (0) | 2012.11.01 |
다시 수행했을때 중복되지 않는 난수발생 CryptGenRandom (0) | 2012.11.01 |
SendMessage와 PostMessage SendMessage()의 응용 WPARAM과 LPARAM의 역할 (0) | 2012.11.01 |
HRESULT / LRESULT 의 정리 ,HRESULT 리턴값 요약 (0) | 2012.11.01 |