在XP上的Python: errno 13 权限被拒绝 - 文件夹中的文件数量限制?
我在XP系统上运行Python 2.6.2。我有很多文本文件(超过10万个),分散在几个文件夹里,我想把它们集中到一个外部硬盘的文件夹里。
我试过用shutil.copy()、shutil.copytree()和distutils.file_util.copy_file()这些方法来把文件从源文件夹复制到目标文件夹。但是这些方法都没有成功复制所有文件,每次尝试都出现了IOError Errno 13 权限被拒绝的错误,我无法在目标文件夹里创建新的文件。
我注意到,无论我用哪个源文件夹,所有目标文件夹里最终都只有13,106个文件。我发现如果文件夹里的文件数量达到这个数(或者更多),我就无法再打开新的文件进行写入,这可能就是我遇到Errno 13的原因。
如果有人能给我一些建议,告诉我这个问题为什么会发生,我会非常感激。
非常感谢,
nick
3 个回答
我建议不要在一个文件夹里放太多文件,这样管理起来会非常麻烦。不过,如果你真的需要这么做,最好不要在FAT格式的文件系统上操作,因为在FAT文件夹里最多只能放64,000个文件。
仔细看错误信息
你遇到的具体问题可能是因为,正如错误信息所提示的,你试图访问一个你没有权限的文件。而且没有理由相信在达到这个限制之前,文件的数量会有什么变化。毕竟这只是台电脑,你只是重复同样的操作。
我猜你的外部硬盘是用FAT32格式化的,而且你写入的文件名大约有45个字符长。
FAT32格式的目录里最多只能有65536个条目。长文件名会占用多个条目。而且,“.”这个符号也会占用一个条目。你能写入65536/5 - 1 = 13106个条目,这很可能说明你的文件名每个占用了5个条目,并且你使用的是FAT32文件系统。这是因为有些代码使用16位数字来作为目录条目的偏移量。
另外,你不想在FAT格式的目录中搜索几千个条目,因为搜索是线性的。也就是说,当你用fopen(some_file)打开文件时,操作系统会从头开始逐个检查文件列表,直到找到some_file,或者检查到列表的末尾。
简单来说:目录是个好东西。
你在用FAT32格式吗?在FAT32的文件夹里,最多只能放65,534个目录项。如果文件名超过8.3格式(就是文件名最多8个字符,后面跟3个字符的扩展名),那么就会占用多个目录项。如果你发现到达了13,106个目录项,这说明每个文件名都比较长,需要用到五个目录项。
解决办法是:使用NTFS格式的磁盘。NTFS没有每个文件夹的限制,并且可以直接支持长文件名(也就是说,不需要用多个8.3格式的目录项)。在NTFS格式的磁盘上,文件总数可以达到大约43亿个,而且可以随意放在文件夹里。