在编程的世界中,一个问题通常有许多种解决办法,对于 p 来说这点尤为明显。很多时候,你会发现很多标准模块的用途基本相同,只是功能略有区别。利用 p 检查某个文件或文件夹是否存在就是一个证明这点的例子。计算机视觉
下面列出了检查文件或文件夹是否存在的几种方法及其区别之处。在下面的示例中,我们假设当前工作目录下有这些文件和文件夹:
-- j:------ j: . -- j: . -&; . -- j:-&;
我们有一个文件夹()一个文件(.)一个文件符号链接(.)和一个目录符号链接()。
检查某个文件是否存在
下面的代码可以说是检查文件是否存在以及其是否为文件的最简单方法。
..(&#;./.&#;) # t..(&#;./.&#;) # t..(&#;./.&#;) # f..(&#;./&#;) # f..(&#;./&#;) # f..(&#;./&#;) # f
注意..能够追踪符号链接(),所以在检查.时得到的结果是t。
实际上只是一个辅助方法( ),其内部使用了.和.s_isreg(),稍后再详细介绍。
检查某个文件夹是否存在
与方法类似,..是检查某个文件夹是否存在或者某个给定路径是否是文件夹的最简单方法。
..(&#;./.&#;) # f..(&#;./.&#;) # f..(&#;./.&#;) # f..(&#;./&#;) # t..(&#;./&#;) # t..(&#;./&#;) # f
同样,..也能够追踪符合链接。它也只是一个简单的辅助函数,其底层调用了.和.s_isdir()。
检查是否存在文件或文件夹
检查某个路径(前提是你不关心其指向的是文件还是文件夹)是否存在的另一种方法,是使用..。
..(&#;./.&#;) # t..(&#;./.&#;) # t..(&#;./.&#;) # f..(&#;./&#;) # t..(&#;./&#;) # t..(&#;./&#;) # f
这个函数不关心路径指向的是文件文件夹还是符号链接,因此这就好像你在使用的是()或()。但实际上,它调用的是.(),如果出错的话它会返回f。
高级方法
上面我一直在说那些方法利用了.模块,因此我觉得详细了解下这个模块是有好处的。这是一个底层方法,可以提高关于文件文件夹套接字缓存等的详细信息。
和前面提到的两种方法一样,.也会追踪符号链接,因此如何你想获得某个链接的状态信息,应该使用的是.()方法。
由于操作系统之间存在差异,.提供的数据可能有所区别。下面是每个操作系统都会提供的一些数据:
_: _: &#; _: &#; _: _: _: _: u, w
你可以使用模块提供的这些数据,获取自己感兴趣的信息,比如说某个路径是否指向一个套接字(.s_issock()),或则是某个文件是不是其实只是一个有命名的管道(.s_isfifo())。
如果你需要更高级的功能,那么应该使用.这个模块。但是大部分情况下,你只需要使用或.中的模块就足够了。
当然,其中一个合理的使用场景是需要对同一个文件进行多次测试,同时向避免系统调用带来的消耗。因此,如果你有不少的测试要做,那么这个模块会提高你的效率哦。