2012-07-25 43 views
0

當用戶卸載應用程序appname時,我想刪除文件夾C:\Users\username\AppData\Roaming\appname使用SHGetSpecialFolderPath +子文件夾和SHFileOperation

首先,我用下面的代碼來獲取路徑C:\Users\username\AppData\Roaming

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

應用程序的名字被定義爲_T("appname")

的第一個問題是:How to append "appname" to "dir"?

假設上面完成。然後我需要使用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可變的雙空終止:

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

應該是'DIR [MAX_PATH + 1]'等,爲更多的空終止。 – 2012-07-25 16:02:12

+0

@Xearinox:我有點困惑嗎?假設真正的路徑是'C:\ a',但'dir'被定義爲'dir [256]'。對於路徑是雙空終止,我們不需要'dir [4]'和'dir [5]'爲'0',但是'dir [MAX_PATH - 1]'和'dir [MAX_PATH - 2] '? – user565739 2012-07-25 16:02:51

+1

但是在代碼中,所有的dir都被初始化爲零,然後dir [4]和dir [5]爲零,這是一些額外的保證。但在現實世界中,您必須執行一些檢查,例如緩衝區溢出等... – Xearinox 2012-07-25 16:08:03

相關問題