在Windows上的C中重命名功能的权限被拒绝

时间:2012-08-07 06:44:53

标签: c windows

我有一个用C开发的应用程序。该应用程序支持多个平台。有一种功能,我们通过文件传输协议将文件传输到不同的机器或本地机器上的任何其他目录。我想要包含一个功能,我可以用一些临时名称传输文件,一旦传输完成,我想用正确的名称(实际文件名)重命名该文件。

我尝试使用简单的rename()函数。它在Unix和Linux机器上运行良好。但它不适用于Windows。它给我一个错误代码13(权限被拒绝错误)。

首先,如果我必须授予文件等一些权限,我在msdn中检查了解重命名的功能。

  1. 我授予该文件的完全权限(假设它是777)。
  2. 我在其他一些帖子中读到,在重命名文件之前我应该​​关闭文件描述符。我也这样做了。它仍然会出现同样的错误。
  3. 很少有其他帖子提到该文件的所有者和应用程序的所有者。该应用程序将作为SYSTEM用户运行。 (但这不应该影响行为,因为我在我的应用程序中尝试了相同的重命名功能,如下所示:
  4. 这可以从我的应用程序中正常工作:

    rename("C:/abc/aaa.txt","C:/abc/zzz.txt");
    

    rename(My_path,"C:/abc/zzz.txt");
    

    不起作用,打印时My_path显示C:/abc/test.txt

    如何重命名文件?我需要它在多个平台上工作。 还有其他事情我应该努力使其发挥作用吗?

2 个答案:

答案 0 :(得分:2)

我有同样的问题,但问题略有不同。如果我执行以下函数调用序列,则在调用重命名函数时会得到“Permission Denied”。

fopen
fwrite
rename
fclose

解决方案是在重命名之前先关闭文件。

fopen
fwrite
fclose
rename

答案 1 :(得分:1)

如果

rename("C:/abc/aaa.txt","C:/abc/zzz.txt");

有效但

rename(My_path,"C:/abc/zzz.txt");

没有,在程序中的完全相同的位置(即用另一行替换一行并且不做任何更改),那么变量My_path可能有问题。这个变量的类型是什么?如果它是一个char数组(因为这是C),它是否适当终止?它是否完全等于“C:/abc/aaa.txt”?

(我希望我可以将此作为评论/澄清而不是作为答案发布,但我的代表不够好:()