2012-05-15 3 views
0

PathCombine 함수에 어려움이 있습니다. SHFileOperation()과 함께 제대로 작동하지 않는 것 같습니다. 가 위처럼 내가 그것을 가지고PathCombine 함수가 올바르게 작동하지 않습니다.

//beginning of method 
    TCHAR* root = new TCHAR[MAX_PATH]; 
    root = L"C:\\Users\\jhow\\Desktop\\\0"; 

    //later on in the method 
    TCHAR* t1Dir = new TCHAR[MAX_PATH]; //root 
    TCHAR* t2Dir = new TCHAR[MAX_PATH]; //temp 
    PathCombine(t1Dir,root,L"Folder1\\%REPLACE_THIS%\\\0"); 
    PathCombine(t2Dir,root,L"Folder1\\temp\0"); 

    sf.pFrom = t1Dir; 
    //sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%"; 
    sf.pTo = temporaryDir; 

    //Copy files 
    int n = SHFileOperation(&sf); 

이 방법은 sf.pTo을 볼 수 있지만, 어떤 이유로 그것도 서로 다른 조합으로 주위를 재생 후 sf.pFrom를 (참조하지 않는 다음과 같이 내 코드는 \ 및 경로 이름 끝에 \ 0). n은 2가됩니다. 이것은 파일을 찾을 수 없다는 것을 의미한다고 생각합니다.하지만 예를 들어, 내가 주석을 쓸 때.

sf.pFrom = t1Dir; 

과로 교체 :

sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%"; 

SHFileOperation는()는 0을 반환하고 나는 모든 파일을 디렉토리에 복사하는 것을 볼 수있다 ... 작동합니다. 나는 그들이 변수를 디버깅하고 마우스를 가져갈 때조차도 똑같은 문자열로 보일 때 이상한 것을 발견합니다 ... 왜 이런 일이 일어나는 지 알고 있습니다. 구문이나 논리에 이상이 있습니까? 나는 그것을 보지 않기 때문에. Visual Studio 2008을 사용하고 있습니다. 시간 내 주셔서 대단히 감사합니다.

+0

우선입니까? ''... ''는 컴파일러에게 그렇게하도록 지시하므로'\ 0'을 직접 추가함으로써 이중 종료 널 문자열로 끝납니다. –

답변

5

root 변수에 대해 힙에 버퍼를 할당했지만 할당 된 버퍼를 누설하면서 해당 변수를 읽기 전용 문자열 리터럴로 즉시 지정합니다.

더 중요한 것은 SHFileOperation()이 이중 널 종료 문자로 작동한다는 것을 고려하지 않고 PathCombine()이 대신 단일 null 종료 문자 열을 반환한다는 것입니다. 입력에 여분의 null을 PathCombine()에 포함하려고 시도했지만 PathCombine()이 단일 null 종료 문자열을 입력으로 사용하므로 추가 null이 표시되지 않으므로 작동하지 않습니다. 추가 널 종결자를 보유하기 위해 출력 버퍼에 충분한 공간을 할당 한 다음 해당 버퍼를 SHFileOperation()으로 전달하기 전에 0으로 설정해야합니다.

이 시도 :

LPTSTR root = TEXT("C:\\Users\\jhow\\Desktop\\"); 

TCHAR t1Dir[MAX_PATH+2] = {0}; 
TCHAR t2Dir[MAX_PATH+2] = {0}; 
PathCombine(t1Dir, root, TEXT("Folder1\\%REPLACE_THIS%\\")); 
PathCombine(t2Dir, root, TEXT("Folder1\\temp")); 

sf.pFrom = t1Dir; 
sf.pTo = t2Dir; 

int n = SHFileOperation(&sf); 
이유를 명시 적으로 문자열 리터럴을 null이 종료되는 날 밖으로 점프
+0

감사합니다. 이것은 매우 도움이되었습니다. 내가 묻고 싶다면'TCHAR t1Dir [MAX_PATH + 2] = {0};이 정확히 무엇을할까요? – JHowzer

+1

스택에'MAX_PATH + 2' 개의 배열을 할당하고, 전체 배열을 모두 한 문장으로 초기화합니다. '= {0}'systax는 선언 된 것과 동시에 배열을 초기화 할 때 공통적으로 사용되는 단축형입니다. 배열 자체를 쉽게 선언 한 다음'memset()'또는'ZeroMemory()'를 사용하여 배열을 별도로 제로화 할 수 있습니다. –

관련 문제