如何在 C 中最近创建的文件夹和文件中具有读取权限?

Posted

技术标签:

【中文标题】如何在 C 中最近创建的文件夹和文件中具有读取权限?【英文标题】:How to have read permission in a recent created folder and file in C? 【发布时间】:2010-09-23 10:16:28 【问题描述】:

我创建了一个文件夹,并在我打开该文件夹内的文件后对其进行写入。 碰巧在那之后我尝试打开文件但我没有权限因此我必须手动更改它。

/* str1 has tha name of the folder */
/* str the bytes I want to write in the file inside the folder*/
...

   mkdir(str1,0777);    
   if (filefd < 0)  

      strncpy(auxstr, str, MAX_MSG + 1);
      strcat(str1,"\\");
      strcat(str1, auxstr);
      filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC);

      nbytes -= (strlen(str) + 1);
      memcpy(auxstr, &str[strlen(str)+1], nbytes); 
      memcpy(str, auxstr, nbytes);

   

   /*write to the file */
   if ((nwritten = write(filefd, str, nbytes)) != nbytes) 
       printf ("can't write on file\n");
       break;
   

为了获得打开创建的文件的权限,我应该更改什么?

非常感谢,


:s

with = 0_CREATE 我仍然有没有权限读取文件的问题。 我必须手动设置它们


我已经有 0_CREAT 了

打开(str1,O_RDWR | O_CREAT | O_TRUNC);

【问题讨论】:

您应该检查 mkdir() 系统调用的返回状态;它可能会失败。目前尚不清楚为什么 filefd 会是负面的,但这是代码片段问题的一部分,而不是完整(非)工作示例。 您还应该检查 open() 系统调用的返回状态;它可能会失败。我还在 open() 调用后发现 memcpy() 操作难以理解。 【参考方案1】:

您忘记了open() 的第三个参数。

open()O_CREAT 的第三个参数正是新创建的文件将拥有的权限。

参考资料:

http://www.opengroup.org/onlinepubs/009695399/functions/open.html

【讨论】:

【参考方案2】:

CesarB 试图告诉您的是,您需要提供权限作为第三个参数:

filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC, 0777);

请使用“添加评论”来回复,而不是为您自己的问题创建新的回复。

【讨论】:

【参考方案3】:

安全问题

问题对目录使用了 0777 权限 - 不要! 在一般情况下,您不应该创建具有 0777 权限的目录。您可以考虑使用 01777,就像在 /tmp 上找到的那样;粗略地说,这确保了从目录中删除文件的人有权修改文件。但是您不应该授予每个人从目录中删除任何文件的权限。并声称umask 设置将保护您,虽然可能是正确的,但仍然不是搞乱那些不知道如何安全设置它的人的生活的好借口。使用 0755 或 0775 但不要使用 0777。

其中一个答案对文件使用 0777 权限 - 不要! 该参数类似于目录参数,但需要注意的是大多数人在创建文件时不会创建可执行文件(链接器编写器将是此一般规则的一个例外),并且无论生成的文件是否是可执行的,允许任何人修改程序仍然是一个非常糟糕的主意。使用 0644 或 0664;很少有使用 0666 的充分理由,更不用说使用 0777 的充分理由。

【讨论】:

umask 的全部意义在于您可以在 open()/mkdir() 上使用 0666/0777 并且用户想要的权限(例如,组可写与否)将得到尊重。不知道如何安全设置 umask 的人很可能会将其设置为默认 0022 或 0002。 这取决于系统;除非您将其设置为其他值,否则许多 Unix 都使用 umask 0 分发。在 mkdir() 上,我将允许 0777,但反对它。在 open() 上,很少有充分的理由使用 0777;我会允许 0666,但也反对它。我认为可公开写是一种糟糕、糟糕、糟糕、糟糕的默认设置。【参考方案4】:

问题是您使用了错误的路径分隔符 - 您尝试使用反斜杠 '\\' 来分隔组件。这是 Windows 的路径分隔符。由于您使用的是基于 *nix 的操作系统,因此您应该使用正斜杠 '/' 作为路径分隔符。事实上,即使在 Windows 上,您也应该使用正斜杠,因为它更便于移植 - Windows 会自动将正斜杠转换为反斜杠。

因此,您尝试在当前目录中创建一个名为“foo\bar”的文件,这可能会失败,因为您没有在当前目录中创建文件的权限。

【讨论】:

以上是关于如何在 C 中最近创建的文件夹和文件中具有读取权限?的主要内容,如果未能解决你的问题,请参考以下文章

执行文件需要读取权限?

Windows 如何解决冲突的文件系统权限/权限?

由于权限不足,无法读取配置文件

如何从已经存在的文件中复制权限?

C - 读取文件并将文本放入具有动态内存分配的字符指针

c#二进制文件的写入和读取