2011-01-06 111 views
5

我需要格式化一個字符串爲雙空終止的字符串才能使用SHFileOperation。雙空終止的字符串

有趣的部分是我發現下面的工作之一,但不能同時:

// Example 1 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T('\0') + _T('\0'); 

    // Example 2 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T("\0\0"); 

    //Delete folder 
    SHFILEOPSTRUCT fileop; 
    fileop.hwnd = NULL; // no status display 
    fileop.wFunc = FO_DELETE; // delete operation 
    fileop.pFrom = szDir; // source file name as double null terminated string 
    fileop.pTo = NULL; // no destination needed 
    fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user 
    fileop.fAnyOperationsAborted = FALSE; 
    fileop.lpszProgressTitle  = NULL; 
    fileop.hNameMappings   = NULL; 
    int ret = SHFileOperation(&fileop); 

有沒有人有這個想法?

是否有其他方式追加雙終止字符串?

+1

哪一個可以工作? – zsalzbank 2011-01-06 02:32:08

+0

這兩個*都不應該工作。如果其中之一發生了,那只是一個意外。 – 2011-01-06 02:33:54

+0

@Greg:不應該第二個例子工作,因爲CString有以下'朋友CString運算符+(常量CString&字符串,LPCTSTR lpsz);'? (通過工作,我的意思是+操作,而不是將'CString'傳遞給'SHFileOperation') – 2011-01-06 02:42:16

回答

8

CString類本身對包含空字符的字符串沒有問題。問題在於首先將空字符放入字符串中。第一個例子的作用是因爲它附加了一個單獨的字符,而不是一個字符串 - 它接受字符而不檢查是否爲空。第二個示例嘗試追加一個典型的C字符串,該字符串按照定義在第一個空字符處結束 - 您將有效地附加一個空字符串。

+0

換句話說,使用單引號或雙引號...... – 2015-03-16 22:14:15

+1

@Mr_and_Mrs_D不只是單引號,而是單引號*。正如Mooing Duck所觀察到的,您可以將兩個字符放在單引號內,但不會將兩個字符追加到字符串中。 – 2015-03-16 22:19:15

4

您不能使用CString來達到此目的。您需要使用您自己的char[]緩衝:僅由現有的NUL終止後複製多一個NULL字節

char buf[100]; // or large enough 
strcpy(buf, "string to use"); 
memcpy(buf + strlen(buf), "\0\0", 2); 

雖然你可以做到這一點,我寧願拷貝中的兩個,以使源代碼更準確地反映了程序員的意圖。

+0

感謝您的建議。但是實例1是如何工作的...... – wengseng 2011-01-06 03:00:08

+1

@wengseng,你確實可以使用CString來達到這個目的,而例1就是你如何做到的。在使用像這樣的固定大小的緩衝區之前,我會使用'std :: vector '。 – 2011-01-06 06:07:03

+0

std :: string也可以在返回到'char []'之前工作。 – 2011-01-06 08:13:04