【问题标题】:C: The remove function removes all files?C: remove 功能删除所有文件?
【发布时间】:2011-01-11 12:33:47
【问题描述】:

我正在使用这样的东西:

char *file;
file = (char *)malloc(BUFSIZE * sizeof(char));
printf("Enter the filename:");
scanf("%s", file);
if(remove(file)) {
   printf("Error while removing");
}

我创建了两个文件:

touch filetobedeleted1.txt
chmod 777 filetobedeleted1.txt

touch filetobedeleted2.txt
chmod 444 filetobedeleted2.txt

现在,我的程序删除了这两个文件,但这不应该发生,对吧?有人知道代码有什么问题吗?

编辑:添加了将名称放入文件的代码...

好的...看起来这一切都取决于目录上设置的权限,但是有没有办法使用文件权限作为检查?

【问题讨论】:

  • 您还没有发布代码中最重要的部分——您究竟是如何以及用什么来填充file 变量的?你是在循环调用它吗?周围的代码是什么样的?
  • @tur1ng - 不,remove() 是标准函数。我们需要他的代码来构建文件名。
  • 如果你能提供更完整的代码sn-p会有所帮助。具体来说,您的程序执行了多少次 remove(file) 语句,以及 'file' 的哪个值?
  • 顺便说一句,我正在使用标准的删除函数调用...
  • 为什么要分配文件两次——一次是静态的,一次是动态的?为什么你将 %c 作为格式参数传递给 scanf 而应该是 %s ?

标签: c chmod file-handling


【解决方案1】:

删除文件只需要目录的写权限。

严格来说,您要删除的是对文件的引用,即硬链接。在文件的所有链接都消失之前,文件本身不会被删除。

用 rm 命令试试吧!

【讨论】:

    【解决方案2】:

    在POSIX文件系统语义下,用于删除文件的权限检查是你是否可以写入文件所在的目录; 你是否对文件本身有写权限。

    (如果目录设置了粘性位,那么您也必须是文件的所有者 - /tmp 使用它)。

    【讨论】:

    • 这是否意味着在Web服务器上,如果管理员不小心删除了目录的写权限,那么一个简单的“DELETE”命令就会搞砸?
    • 不,因为像rm 这样的用户空间工具通常会要求您确认是否要删除没有写入权限的文件(参见rm: remove write-protected regular empty file x'?`)。假设如果您正在编写 C 程序,那么您就知道自己在做什么。
    【解决方案3】:

    remove()调用unlink(),根据man 2 unlink,只需要目录的写权限。

    【讨论】:

      【解决方案4】:

      您可以使用getumask() 函数并在调用remove() 之前对其进行检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多