2012-05-15 49 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()的作品......它返回零,我可以看到所有文件複製到該目錄中。我發現這個奇怪的看法,因爲它們看起來是完全相同的字符串(即使當我調試並將鼠標懸停在變量上時)......任何人都知道爲什麼會發生這種情況?我的語法或邏輯有問題嗎?因爲我沒有看到它。我正在使用Visual Studio 2008.非常感謝您的時間。

+0

,在跳出我的第一件事是你爲什麼要明確地空終止您的字符串文字? ''「'指示編譯器爲你做這件事,所以通過自己添加'\ 0'你最終會得到一個雙空終止的字符串。 –

回答

5

您正在爲您的root變量在堆上分配一個緩衝區,但是會立即將該變量指向只讀字符串文本,從而泄漏分配的緩衝區。

更重要的是,您沒有考慮到SHFileOperation()對以雙空字符結尾的字符串進行操作,但PathCombine()會返回單個以null結尾的字符串。您正試圖在您的輸入中包含一個額外的空值到PathCombine(),但這不起作用,因爲PathCombine()以單個空字符結尾的字符串作爲輸入,因此它永遠不會看到您的額外空值。您需要在輸出緩衝區中分配足夠的空間以容納額外的空終止符,然後在將這些緩衝區傳遞給SHFileOperation()之前確保將它們設置爲零。

試試這個:

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); 
+0

謝謝。這非常有幫助。如果你不介意我問,'TCHAR t1Dir [MAX_PATH + 2] = {0};'確實做了什麼? – JHowzer

+1

它在棧上分配一個'MAX_PATH + 2'數組'TCHAR'元素,並將整個數組初始化爲零,全部在一個語句中。 '= {0}'systax是在聲明數組的同時初始化數組的常用簡寫形式。你可以簡單地聲明數組,然後使用memset()或ZeroMemory()來單獨清零數組。 –