2011-11-16 66 views
2

編譯器在構建時沒有抱怨,而且我的程序說它工作並創建文件夾,但文件沒有移動。我究竟做錯了什麼?Boost rename()函數不起作用

#include <iostream> 
#include <boost/filesystem.hpp> 

using namespace std; 
using namespace boost::filesystem; 

char c = 'c'; 

bool move(){ 

if ((bool) rename("C:\\fldr1" "rawr.txt", "C:\\fldr2" "rared.txt") == (true)){ 
    return true; 
} 
else{ 
    return false; 
} 

} 
int main(int argc, char argv[]) 
{ 

    if (argv[1] = (c)) 
    { 
     if (is_directory("C:\\fldr2")){ 

      if (move){ 
      cout << "Done 1!" << endl; 
      } 
     } 
     else{ 
      cout << "Dir doesn't exist!" << endl; 

      if ((bool)create_directory("C:\\fldr2") == (true)){ 

       if (move){ 
        cout << "Done 2!" << endl; 
       } 
      } 
     } 
    } 
    return 0; 
} 

我使用Windows 7,代碼塊10.05,G ++ 4.4.1,和Boost 1.47

+2

你居然鑄造'void'返回功能,以'bool'「返回值」,並檢查他們?這是否編譯? –

+0

@larsmans它編譯,但函數沒有正確調用或什麼 – RunningDroid

+2

你明白,你不會得到一個有意義的價值,你呢? –

回答

4
  • 避免C風格投下有助於避免意外一樣做字符串"C:\\fldr1" "rawr.txt" == "C:\\fldr1rawr.txt"if(void)
  • 隱含的串聯也可能會產生意想不到的結果很多問題。
  • Boost重命名可以拋出你不處理的異常。
  • 依靠隱式強制轉換文字字符串來提升路徑是一個較小的問題。

你可以做類似下面的替代:

bool move() 
{ 
    path src("C:\\fldr1\\rawr.txt"); 
    path dest("C:\\fldr2\\rared.txt"); 

    try { 
    rename(src, dest); 
    } 
    catch (...) 
    { 
    return false; 
    } 

    return exists(dest); 
} 
+0

它的工作原理,但我不得不改變它,所以它會編譯,我複製「路徑de​​st(」C:\\ fldr2 \\ rared.txt「);」在行「返回存在(dest)」之前;「謝謝! – RunningDroid

+0

@RunningDroid:考慮到'rename'需要'dest' ...# – ildjarn

+0

@ildjarn:我改變了它,因爲如果我嘗試編譯它,原因是編譯器給我「錯誤:'dest'未在此範圍內聲明「(這可能是一個單獨的問題) – RunningDroid

6

我認爲你的意思

if (move()){ 

,而不是

if (move){ 

的第二種情況測試是否存在move函數,即它的指針不是NULL(總是爲真),第一種情況是tes如果移動成功了。

+0

該文件仍然不會移動,問題與我稱之爲rename()函數的方式? – RunningDroid

3
if (move) 

在這裏,您正在測試函數指針不爲空 - 您需要實際調用該函數。嘗試

if(move())