2012-02-22 131 views
0

我有下面的代码,出于某种原因,rename(..)函数失败。我已经尝试提供完整路径,以及更改工作目录,然后提供只是文件名。下面是后者失败,errno13。所有文件都在我的这个win32控制台项目的Projects文件夹中。我不明白为什么简单地改变文件名是如此困难,无论当前的工作目录是什么。在Visual Studio 2008中重命名文件

//fname_string* points to beginning of actual filename 
//filename contains entire output file path 
//file_ext* points to .csv portion 
//fname will get old filename 
fname_string = strrchr(filename, '\\'); 
if(fname_string == NULL) 
{ 
    fname_string = filename; //no dir supplied, so set it to filename 
} 
else 
{ 
    strncpy(fname, filename, fname_string - filename); 
    fname[fname_string-filename] = '\0'; 
    chdir(fname); 
    fname_string++; //now points to filename 
    read_success = errno; //this succeeds supposedly 
} 

strcpy(fname, fname_string); //save old file path 
sprintf(file_ext, "_%d.csv", append_esn); //append_esn = 1234 
read_success = rename(fname, fname_string); 
read_success = errno; //giving me 13 

编辑: 我是哑巴,我被关闭“输入”文件,而不是“产出”的文件。所以FYI,文件最好关闭!我认为它被关闭的原因是因为我刷新了输出文件,有时它没有一个零大小的文件。

所以重命名可以采取一个完整的路径或只是文件名,如果它在工作目录中...有两个小时的废话.... 因此,上述将工作,或只是做下面假设提供相同的指针以上:

strcpy(fname, filename); //save old file path 
sprintf(file_ext, "_%d.csv", append_esn); 
read_success = rename(fname, filename); 
+0

您是否尝试在'rename'之前打印文件名? – cnicutar 2012-02-22 21:41:39

+0

我正在调试,当它们悬停在它们上面时,fname = log.csv和fname_string是log_1234.csv 类似的问题在这里[link](http://stackoverflow.com/questions/4512256/win32-api -for-rename-a-file-in-c)我可以查看 – NickG 2012-02-22 21:43:52

+0

如果rename()返回-1,则只应该**检查errno。 – wildplasser 2012-02-22 21:48:38

回答

0

我上面的最后一条评论回答了这个问题。