c-如何设置输出文件模式权限(rw-rw-rw-)



我已经创建了一个代码,该代码应该能够复制用户建议的文件。我想知道的是:如何设置输出文件模式,以及如何确定此代码中的输出文件模式权限?

#include <stdio.h>
#include <stdlib.h>
int main()
{
char c;
char source_file, target_file;
FILE *in, *out;
printf("Enter name of file to copyn");
   gets(source_file);
printf("Enter name of file to copy ton");
  gets(target_file);
in = (source, O_RDONLY);
out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
/* error handing */
if( in == NULL )
{
   printf("Error. n");
   exit(0);
}
printf("Enter the copied file name n");
gets(target_file);
out = fopen(target_file, "w");
/*error handing*/
if( out == NULL )
{
  fclose(in);
  printf("File opening error.n");
  exit(0);
}
while(( c = fgetc(in) ) != EOF )
  fputc(c,out);
fclose(in);
fclose(out);
return 0;
}

使用标准I/O控制文件权限

标准I/O库的缺点之一是无法控制创建的文件的权限,主要是因为这些权限是特定于平台的(无论如何,比C标准允许的权限更大)。POSIX open()函数允许您在创建文件时控制文件的权限。

对于类似POSIX的系统,可以使用chmod()fchmod()系统调用。你需要知道你的rw-rw-rw-模式是八进制0666。

chmod(target_file, 0666);
fchmod(fileno(out), 0666);

功能可能会失效;你应该检查一下他们没有。

您也可以使用umask()函数或(小心)umask命令来影响默认权限。例如,在shell中设置umask 022意味着不会创建可由组或其他人写入的文件。


修改修改后的代码

  1. 你不需要担心你打开要读取的文件的权限(或者,至少,你很少需要这样做)
  2. 担心写入文件的权限更为正常
  3. 您当前的代码建议是:

    in = (source, O_RDONLY);
    out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
    

    这不会调用open(),而是为两个FILE *变量分配一个整数值,这两个变量应该会生成编译器警告。请注意,逗号表达式先计算表达式的LHS,然后计算表达式的RHS,得到RHS作为总值。CCD_ 10经典地为0;CCD_ 11等项的组合不为零。

如果你要用这些选项打开文件,那么你需要这样的东西:

int fd_i = open(source_file, O_RDONLY);
if (fd_i < 0)
    …report error opening source_file…
FILE *in = fdopen(fd_i, "r");
if (in == 0)
    …report error creating file stream for source_file…
int fd_o = open(target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (fd_o < 0)
    …report error opening target_file…
FILE *out = fdopen(fd_o, "w");
if (out == 0)
    …report error creating file stream for target_file…

然而,我可能不会将fdopen()用于输入文件——我会像最初那样直接使用fopen()——但我可能会将其用于输出文件。

最新更新