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.0hwnd04
shfo.1wFunc44
shfo.2pFrom84
shfo.3pTo124
shfo.4fFlags164
shfo.5fAnyOperationsAborted204
shfo.6hNameMappings244
shfo.7lpszProgressTitle284








출처 : 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);

반응형

+ Recent posts