- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经看过这两个清空目录的线程:
Removing a non empty directory programmatically in C or C++
Delete folder and all files/subdirectories
但是,清空作为这些线程的答案给出的目录的函数非常复杂,一个答案可能会遇到堆栈溢出。
当我想删除和添加目录时,我想用c语言在linux平台上完成。不过,如果你还想在windows上解释这背后的原因,我也会很感激的。
这是我要实现的代码:
system( "rm -rf /some/directory" )
mkdir("/some/directory", 0700);
最佳答案
rm -fr /some/directory
命令必须为您执行递归工作。使用该命令比编写自己的代码来完成相同的工作要简单得多——它体现了懒惰的优点,并利用了程序规模上的代码重用。(除非目录已为空,否则不能对其使用rmdir()
系统调用。)所以这并非完全不合理。
一个问题是安全性:是否可以在您的路径上放置系统rm
命令的替代选项?在unix上,路径中的/bin
和/usr/bin
是第一位的,还是其他目录是第一位的?
如果您认为使用/bin/rm
(或/usr/bin/rm
)足够安全,那么这可能是比未经修饰的rm
更好的选择,但总的来说,这还不算太糟。
另一个问题是安全性的另一个方面-您真的可以删除并创建目录吗?你能在/some
里写吗?如果删除并重新创建,您是否应该保留/some/directory
的当前所有者、组和权限?在这些操作之后,目录将由进程的有效uid拥有;if将属于具有进程的有效gid的组(除非在/some
目录上设置了一个粘性位-或者除非您在macos上);并且权限将被0777
的当前设置修改。
如果这些问题不重要,或者是可以避免的,那么删除并重新创建是可行的。
对以上评论进行扩展:
当你在评论中提到umask()
电话时,我不知道你在说什么。system()
函数执行通过命令解释器作为参数传递的字符串。当你写代码的时候,你必须考虑当有人试图让你运行它的时候,它会怎么出错。当您编写system()
时,您依赖于shell查找normal"rm -fr /some/directory"
命令并正常工作。但是,如果您的rm
有一个类似于PATH
的值(这样您自己的私有$HOME/bin:/bin:/usr/bin
目录中的命令优先于系统提供的命令使用),那么如果用户可以将自己的脚本安装为bin
,则他们可以使用您的特权执行任意代码-这可能允许他们在以后保留你所有的特权。他们甚至可以清理(大部分)曾经有过脚本的证据。
避免此类问题的一种方法是请求$HOME/bin/rm
(当然,除非$HOME/bin/rm
是"/bin/rm -fr /some/directory"
而不是rm
)。这可以说是更安全的。以前有一些攻击可以通过/usr/bin
环境变量进行;这些攻击是由现代shell进行的,这些shell不使用/bin
的任何继承值。
注意,一个问题是解释IFS
命令是否成功。IFS
选项意味着它在几乎所有情况下都会报告成功,但是如果目录没有消失,那么您的rm
调用将失败。
至于-fr
的安全性,我对您所说的理解是,可能选择了错误的目录。我无法想象会发生什么。
假设您确实拥有修改mkdir("/some/directory", 0777)
目录的权限(您需要能够删除/some/directory
),并且您可以修改旧版本/some
的所有子目录,那么您可以从用户/some/directory
拥有的/some/directory
开始,使用组/some/directory
和权限775,然而,在命令和系统调用(注意victim
是函数而不是系统调用;witless
是系统调用)成功之后,该目录可能由用户system()
、组mkdir()
拥有并具有0777权限。这可能不太理想。如果您不想破坏这样的权限设置,那么您可能不想使用“删除并重新创建”技术,或者,也不想使用本例所示的这种头脑简单的技术。然后,您必须更加努力地删除目录的内容,而不修改这些属性。您可以扫描目录(victor
,mischief
,opendir()
并对每个名称或名称集调用readdir()
,以彻底清除目录,而不必删除目录本身。这是混合复杂性。它比简单的删除和重新创建更为烦琐,但远没有处理多个级别上的完全递归删除那么烦琐。
如我之前所说,你必须决定这些问题是否重要。重要的是你意识到问题的存在,并且你对是否处理这些问题做出了有意识的(明智的)决定,以及如何处理这些问题。
请记住,如果您的程序可能是以root(管理员)权限运行的,那么更重要的是要小心—但即使只有普通的普通用户才会运行该程序,这仍然很重要。
关于c - 如果我想清空目录,是否有任何理由不应该删除它并重新创建它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048215/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!