使用c在linux中创建具有给定名称和权限的文件

时间:2017-12-14 13:33:49

标签: c linux file permissions chmod

我必须在c create中用2个参数编写一个函数:文件名和文件权限。 (例如:create(" f"," rwxr_xr_x")此函数创建文件f,它将接收" rwxr_xr_x"权限并将返回0)如果文件已存在或者它无法创建它将返回一个不同于0的数字。 以下是我提出的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int create(char *name, char *mode)
{
    int fp = fopen(name, "r+");
    if (fp > 0)
    {
        int i, n = 0;
        for (i = 0; i < 9; i = i + 3)
        {
            int nr = 0;
            if (mode[i] == 'r')     nr += 4;
            if (mode[i + 1] == 'w') nr += 2;
            if (mode[i + 2] == 'x') nr += 1;
            n = n * 10 + nr;
        }
        chmod(name, n);
        return 0;
    }
    else
        return -1;
}

int main(int argc, char* argv[])
{
    if (argc != 3) printf("%s\n", "Error: Incomplet number of arguments!");
    int fp;
    fp = create(argv[1], argv[2]);
    if (fp == 0) printf("%s\n", "File successfully created!");
    else printf("%s\n", "Could not create file!");
    return 0;
}

我尝试在r +模式下打开文件,然后使用chmod更改权限,{不确定这是否正确)。当我编译它时,我得到以下警告:&#34;初始化从指针生成整数而没有对行int fp=fopen(name, r+)进行强制转换。有人可以帮我解决这个问题并告诉我代码是否正确?我是linux的新手

UPDATE 所以我做了一些修改,正如所建议但我认为它仍然没有给出正确的权限(因为我说我是linux的新手,所以我可能是错的)。以下是我的代码现在的样子:

 #include <stdio.h>
 #include <stdlib.h>
 #include <stdio.h> 
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <fcntl.h>
 int create(char *name, char *mode)
 {
  int i,n=0;
  for(i=0; i<9; i=i+3)
   {
      int nr=0;
      if(mode[i]=='r')   nr+=4;
      if(mode[i+1]=='w') nr+=2;
      if(mode[i+2]=='x') nr+=1;
      n=n*8+nr;
   }   
  int fl=creat(name, n);
  printf("%d\n", n); 
   if(fl>0)
       return 0;
   else return -1;
}

int main(int argc, char* argv[])
{
   if(argc != 3)
      printf("%s\n", "Error: Incomplet number of arguments!");

   int fp;
   fp=create(argv[1], argv[2]);
   if(fp==0) printf("%s\n", "File successfully created!");
   else printf("%s\n", "Could not create file!");
   return 0;
}

另外,如何检查文件是否已存在?因为在这种情况下,我的函数必须返回一个不同于0的值并打印错误消息

1 个答案:

答案 0 :(得分:0)

首先你对这一行有疑问:

int fp=fopen(name, "r+");

fopen返回FILE *类型而非int的值,以便该行应为

FILE *fp=fopen(name, "r+");

这意味着您需要测试fp不是NULL而不是> 0

创建文件后,您还应该记得调用fclose(fp)来关闭文件。

处理权限的代码也是错误的。通常传递给shell中chmod命令的值是八进制,而不是十进制,所以这一行是错误的。

n=n*10+nr;

您希望每次多出n 8个。

由于它有点字段,您可以使用&#39; | =&#39;来改善代码。运算符更改相应的位而不是使用加法。

if(mode[i]=='r')   nr |=4;
if(mode[i+1]=='w') nr |=2;
if(mode[i+2]=='x') nr |=1;

此外,您应该检查以确保该模式在循环之前至少有9个字符。