2011-11-16 62 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())