2012-08-07 81 views
1

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

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

的第一件事,我在MSDN查就知道重命名的功能,如果我有权授予一些权限文件等

  1. 我授予完全权限的文件(可以说是777)。
  2. 我在其他几篇文章中读到我应该在重命名文件之前关闭文件描述符。我也是这样做的。它仍然会给出同样的错误。
  3. 很少有其他文章提到关于文件的所有者和应用程序的所有者。该应用程序将以SYSTEM用户身份运行。 (但是,这不应该影响的行为,因为我在我的应用程序尝试同样的重命名功能如下:

此工程从我的应用程序罚款:

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

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

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

如何重命名fi乐?我需要它在多个平台上工作。 有没有其他的事情我应该努力使它工作。

+3

我们需要一个完整的,自包含的测试程序,可以重现问题。理想情况下,该程序将创建演示该问题所需的所有文件和目录,但如果这更容易,.bat文件也可以。 – zwol 2012-08-07 06:57:10

+0

我正在尝试在版权软件应用程序的其中一个文件中添加这部分代码。它非常庞大,必须与成千上万的图书馆联系起来。因此,共享任何可执行文件或库是不可能的。 – San 2012-08-07 07:22:18

+0

snippet会是: fun1(datatype1,datatype2) { //获取该设备协议的数据 if(路径不为空)/ *路径指需要重新命名的文件所在的位置*/ { //要在重新分配之前添加重命名 deallocate(path); } } – San 2012-08-07 07:23:03

回答

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”吗?

(我希望我能张贴此作为评论/澄清,而不是作为一个答案,但我的代表处是不够好:()

+0

我假设变量是适当的。这是一个许可问题。需要从应用程序授予适当的权限,以便重命名成功。 为什么我认为var是正确的是因为: 我试过这样的: char * str =“C:/abc/test.txt”; rename(str,“C:/abc/zzz.txt”); //正常工作 /* My_var和str相同* / – San 2012-08-07 07:28:15

0

我有同样的问题,但问题是略有不同。如果我做的函数调用按以下顺序,我得到了“权限被拒绝”,呼吁重命名功能时。

fopen 
fwrite 
rename 
fclose 

解决的办法是先关闭文件,做重命名之前。

fopen 
fwrite 
fclose 
rename