2010-11-26 302 views
8

如何檢查目錄是否已經存在於MFC(VC++)中? 我正在使用下面的代碼來獲取當前的應用程序路徑,在那裏我正在創建NDSLog文件夾 ,以便我所有的日誌文件應該放在那裏,現在我想檢查條件如果NDSLog文件夾已經存在不要創建它。怎麼做?如何檢查目錄是否已經存在於MFC(VC++)中?

謝謝。

char strPathName[_MAX_PATH]; 
    ::GetModuleFileName(NULL, strPathName, _MAX_PATH); 

    // The following code will allow you to get the path. 
    CString newPath(strPathName); 
    int fpos = newPath.ReverseFind('\\'); 

    if (fpos != -1) 
    newPath = newPath.Left(fpos+1);  
    newPath += "NDSLog\\" ; 

    CreateDirectory(newPath,NULL); 
+5

我可以插入一個請求,不要把你的日誌放在當前目錄下嗎?在Vista和Windows 7上,非升級(換言之,普通)應用程序不能在Program Files下的任何地方寫入。由於您今天正在編寫此代碼,而您正在爲Windows編寫代碼,請使用AppData(CSIDL_APPDATA)作爲日誌。爲您的應用程序創建一個子目錄,並且如果您喜歡另一個針對日誌的子目錄。 – 2010-11-27 19:29:32

回答

22

來檢查文件/目錄是否存在的最簡單的方法是使用GetFileAttributes

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) { 
    CreateDirectory(newPath,NULL); 
} 

請注意,即使失敗,函數將返回INVALID_FILE_ATTRIBUTES由於一些其他原因,如沒有權限要訪問該文件,所以您應該檢查返回值CreateDirectory以確保它成功。

實際上,你不需要檢查目錄是否已經存在;

if (!CreateDirectory(newPath,NULL)) { 
    if (GetLastError() == ERROR_ALREADY_EXISTS) { 
    // directory already exists 
    } else { 
    // creation failed due to some other reason 
    } 
} 
+1

這兩種解決方案都沒有考慮到,可能有一個(常規)文件與要創建的目錄具有相同的名稱:第一種方法(`GetFileAttributes()`)應該添加一個檢查,如果「目錄」屬性在返回值!=`INVALID_FILE_ATTRIBUTES`的情況下設置。然後該目錄已經存在。否則,具有相同名稱的常規文件將阻止創建目錄。第二種方法相同:如果常規文件(不是目錄)已經存在,則`CreateDirectory()`返回`ERROR_ALREADY_EXISTS`。 – 2012-11-15 09:58:06

0

FindFirstFile。儘管名稱中包含「File」,它仍能很好地找到目錄。

1

我使用PathFileExists:如果該目錄已經存在CreateDirectory將設置一個錯誤代碼。

0

我必須注意,當文件是網絡路徑時GetFileAttributes工作緩慢。其實,它第一次運行速度很慢,之後很快。

1

PathIsDirectory()怎麼樣?在原始示例中,您可以使用PathRemoveFilespec(),然後使用PathCombine()添加新的文件名/擴展名。如果您的目標只有Windows 8或更高版本,這種情況不太可能,但這些功能的安全性更高。

相關問題