2012-07-25 2 views
0

사용자가 appname 응용 프로그램을 제거하면 C:\Users\username\AppData\Roaming\appname 폴더를 삭제하려고합니다.SHFileOperation과 함께 SHGetSpecialFolderPath + SubFolder 사용

TCHAR dir[MAX_PATH]; 
dir[0] = '\0'; 
BOOL ok = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, TRUE); 

APPNAME은 첫 번째 질문은 _T("appname")

다음과 같이 정의된다 : How to append "appname" to "dir"?

위 이루어집니다 가정

첫째, 나는 경로 C:\Users\username\AppData\Roaming를 얻기 위해 다음 코드를 사용합니다. 그런 다음 SHFileOperation을 사용하여 비어 있지 않은 폴더 C:\Users\username\AppData\Roaming\appname을 삭제해야합니다. 그래서 SHFILEOPSTRUCT 구조에 널 종료 문자열이 두 개 필요합니다. 그래서

How to get a double null-terminated string from the result of the first step? Just append _T("\0\0") to it?

업데이트 : 나는 경로를 얻을 수 TCHAR *dir2 = lstrcat(dir, appname);를 사용할 수 있습니다. 그러나 TCHAR *dir3 = lstrcat(dir2, _T("\0\0"));을 사용하려고 시도하면 폴더가 삭제되지 않습니다. \0의 숫자는 작동하지 않습니다.


p.s : 내가 직접 다음과 같은 경우, 내가이 일을하는 데

. 문제는 내가 사용자 독립적 인 것이기를 바란다는 것이다.

TCHAR path[] = _T("C:\\Users\\username\\AppData\\Roaming\\appname"); 
memcpy(path + sizeof(path)/sizeof(TCHAR) - 1, _T("\0\0\0"), 3); 

답변

1

추가 경로는 PathAppend입니다.

TCHAR dir[MAX_PATH] = {0}; 

BOOL ok = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, TRUE); 

PathAppend(dir, _T("appname")); 

당신이 디렉토리 변수의 이중 널 종료를 확인하려면 다음

dir[MAX_PATH - 1] = 0; 
dir[MAX_PATH - 2] = 0; 
+0

는'이어야한다 DIR [MAX_PATH + 1] '등을 추가 널 종료합니다. –

+0

@ Xearinox : 나는 혼란 스럽다. 실제 경로가'C : \ a'라고 가정하고,'dir'은'dir [256]'으로 정의됩니다. 경로가 double null로 끝나기 위해서는'dir [4]'와'dir [5] '가'0 '이 아니라'dir [MAX_PATH - 1]'과'dir [MAX_PATH - 2] '? – user565739

+1

그러나 코드에서 dir의 모든 tchars는 0으로 초기화되고, dir [4]와 dir [5]는 0으로 초기화됩니다. 이것은 몇 가지 추가 사항입니다. 하지만 현실 세계에서는 버퍼 오버 플로우 등과 같은 검사를해야합니다. – Xearinox