2012-02-16 71 views
2

更新:科迪灰色的答覆如何找到桌面的路徑在C++

後,我想找到一種方法將文件保存到桌面。由於每個用戶都有不同的用戶名,我發現下面的代碼會幫助我找到別人桌面的路徑。但是,我怎樣才能將以下內容保存到桌面?

#include <iostream> 
#include <windows.h> 
#include <fstream> 
#include <direct.h> 
#include <shlobj.h> 
using namespace std; 
int main() 
{ 
    ofstream file; 

    TCHAR appData[MAX_PATH]; 
    if (SUCCEEDED(SHGetFolderPath(NULL, 
            CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE, 
            NULL, 
            SHGFP_TYPE_CURRENT, 
            appData))) 

    wcout << appData << endl; //This will printout the desktop path correctly, but 
    file.open(appData +"/.txt"); //how can I open the desktop path here?? 
    file<<"hello\n"; 
    file.close(); 
    return 0; 
} 

微軟的Visual Studio 2010,Windows 7中,C++控制檯

+2

請不要更新這樣的問題,答案將成爲與這個問題無關。誠懇地構想一個新的問題,你正在尋找什麼。 – Shirish11 2012-02-16 09:07:42

回答

5

的問題是,你正在編譯與UNICODE應用程序定義(如你應該是),這意味着C風格字符串不存儲在char陣列中(因爲它們將用於ANSI字符串),而不是wchar_t陣列。

這就是爲什麼你不能從char*轉換爲LPWSTR(這是typedef編輯在Windows標頭爲wchar_t*)。

解決方法是更改​​字符串緩衝區的類型。您可以使用wchar_t明確:

wchar_t appData[MAX_PATH]; 

或利用即會自動#define到合適的類型,這取決於你是否有UNICODE編譯定義的TCHAR宏:

TCHAR appData[MAX_PATH]; 

這不是唯一的問題。一對夫婦的其他注意事項:

  1. 你應當認真考慮編寫的Win32代碼時使用的文字01TRUEFALSE符號來代替。當函數的文檔指示它接受BOOL類型的值時,請利用已爲該類型定義的符號。它使您的代碼更清晰易讀,即使您可以合理地認爲這些符號永遠不會更改標題中的定義。

  2. CSIDL_LOCAL_APPDATA是不是正確的常數使用,如果你想桌面文件夾。這將返回一個與當前用戶關聯並且打算由應用程序用於存儲數據的文件夾,該文件應該是而非與用戶漫遊(它應該存儲在本地機器中,並且僅在處可用)。所有的事情都考慮到了,這可能是一個比桌面更好的選擇,因爲應用程序應該真的有一個很好的理由,然後在用戶的桌面上散佈垃圾。

    如果您需要數據與應用程序一起漫遊,則應該使用CSIDL_APPDATA來代替。我提供了所有這些不同文件夾的簡要說明,它們是什麼意思,以及何時應該在my answer here中使用它們。

    但請注意,SHGetSpecialFolderPath函數將您限制到特定文件夾的特定子集。這讓我感到...

  3. 由於Windows 2000的(老實說,我不認爲有任何人還有編寫應用程序針對Windows 之前 2000年的版本)中,SHGetSpecialFolderPath function已經過時了。

    對於那些針對Windows 2000和XP的首選更換爲SHGetFolderPath,你會以類似的方式使用:

    TCHAR appData[MAX_PATH]; 
    
    if (SUCCEEDED(SHGetFolderPath(NULL, 
               CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, 
               NULL, 
               SHGFP_TYPE_CURRENT, 
               appData))) 
    { 
        wcout << appData << endl; 
    } 
    

    和家庭的最新成員是SHGetKnownFolderPath新的應用程序只針對Windows Vista和後來。

+0

@Justin:嗯,問題可能是你需要使用'wcout'來打印值,而不是'cout',因爲你正在處理寬字符串... – 2012-02-16 07:28:42

+1

@Justink嘗試用'CSIDL_DESKTOPDIRECTORY'來檢索用戶桌面目錄 – Shirish11 2012-02-16 07:36:30

+1

@ Shirish11:SHGetSpecialFolderPath函數不支持該值。你將不得不改變我描述的其他功能之一。 – 2012-02-16 07:38:28