2013-12-14 26 views
0

我嘗試處理這些情況,當我嘗試通過向文件名中添加加號來編寫已存在的文件時。簡而言之,就像Windows複製文件時所做的一樣。異常處理 - 如果它與原始文件存在,則使用另一個文件名編寫文件

假設我有一個文件test.bmp。我想對其應用過濾器並將過濾的圖像保存爲testout.bmp。但該文件夾中已存在testout.bmp,因此程序會捕獲該文件並將其保存爲testout(1).bmp例如。在我的代碼中,我嘗試使用exeptions。我的想法是這樣的:(僞代碼)

bool IMAGE_DATA::openFile(const char* filename) 
{ 
    int i = 0; 
    try 
    { 
     if(file_exists(filename)) throw whatever; 
    } 
    catch(type whatever) 
    { 
     changefilename(filename,i) 
     i++; 
     if(file_exists(filename)) /* throw whatever/do something */; 
    } 
}; 

目前如果文件已經存在,我的程序只存在(當有文件夾中有該名稱的文件file_exists剛剛返回true)。

我開始用異常處理重新設計我的基函數,而不是在發生任何錯誤時簡單地返回false。我寫不管這裏因爲我會有更多的拋出(如果文件無法打開或存在,但與我的文件等相同)。

我該如何才能嘗試趕上文件名,直到有一個文件名是正確的。或者有沒有更簡單的方法,我不應該使用異常?處理這個問題的最佳設計是什麼?

回答

2

我不能完全理解你爲什麼要使用例外。流量控制的例外情況被認爲是非常糟糕的風格,除了一些非常具體的成語。拋出並捕獲任何不是從std :: exception派生的東西也是一個禁忌。另外,你發佈的代碼甚至不會接近編譯,所以我的答案也是僞代碼。還有一件事,爲什麼使用char *作爲名稱而不是std :: string?

這會做你所要求的嗎?

bool IMAGE_DATA::openFile(std::string filename) 
{ 
    while(file_exists(filename)) 
    { 
     filename = add_1_to_filename(filename); 
    } 

    open(filename); 
} 
+2

+1,[這裏](http://stackoverflow.com/a/18073392/33499)是一個更完整的實現,但它使用Qt – wimh

+0

,所以異常不是這個。但是我讀了_Exception處理來識別程序無法處理的問題,並告訴它們有關用戶的信息,因爲用戶可以處理它們。從這個http://stackoverflow.com/questions/4506369/when-and-how-should-我使用的,異常處理?RQ = 1。然後,如果我使用消息框並請求用戶輸入另一個名稱,則可以或不可以由異常處理。 (+1兩者) –

+1

@PnDs但它不是一個意外的問題。非常期望file_exists可以返回true或false - 這就是它的用途。而你正在處理這個問題。如果不管嘗試什麼都找不到合適的文件名,那麼拋出一個異常!在程序中更進一步,這可能會顯示一個消息框,或以其他方式優雅地通知用戶。 – polkadotcadaver

1

在您的方案中,擁有現有文件也不例外。因此,不要使用它們。 如果您正試圖通過其他信息在你身邊可以使用函子:

#include <iostream> 

struct FileExits { 
    bool value; 
    std::string information; 

    FileExits(const std::string& name) 
    : value(true), information("Test") 
    {} 

    operator bool() const { return value; } 
}; 

int main() { 
    // Endless loop in this example 
    std::string name; 
    while(FileExits result = name) { 
     std::cout << result.information << std::endl; 
    } 
    // ... 
    return 0; 
} 
相關問題