您现在的位置: 365建站网 > 365学习 > linux和windows文件名长度限制问题

linux和windows文件名长度限制问题

文章来源:365jz.com     点击数:623    更新时间:2018-05-24 08:13   参与评论
文件名和目录名在操作系统中都有最大长度的限制,而且不同系统中的最大长度不同。

这些限制在Linux系统下可以通过修改系统内核修改这个限制。

Linux文件名的长度限制是255个字符

windows下完全限定文件名必须少于260个字符,目录名必须小于248个字符。

win7x64位环境:

260个长度是作为总的文件名长度限制。

例如所在文件夹的长度为50

则文件名的长度被限制在210之下,超出的话会被进行截断。

如果在程序中的话,超出长度的话MoveFile/CopyFile会返回错误,处理失败。

例子:

1.       我手动在C:\建立一个文件,使用280个长度进行重命名,实际生成的却是文件名是256个长度

1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklm.txt

实际生成文件名:

共计256个长度,加上”C:\”三个长度,共计259个长度,再加一个字符串结束符’\0’,正好260位长度

1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz123

2.       把这个文件往”C:\temp”目录copy的时候

报错文件名对目标文件夹可能过长,您可以缩短文件名并重试,或者尝试路径较短的位置。

 

意味着,

  1. 要么我们把文件名改短一些,
  2. 要么copy 的目录长度短一些,例如向”D:\”复制就没会有问题。

结论:

Linux文件名的长度限制是255个字符(Byte)。
windows下完全限定文件名必须少于260个字符,目录名必须小于248个字符。
执行代码如下:

#!/usr/bin/python
# encoding: utf-8

import os

'''
代码仅适用于Python2版本,3版本需要改为range

'''


def file_name_max_len():
    max_len = 0
    try:
        for i in xrange(1, 10**10):
            name = "w" * i
            with open(name, 'w') as ofs:
                ofs.write("test" * 10)
            max_len = i
            os.remove(name)
    except IOError as ioe:
        print("Maximum length of file name is: {}".format(max_len))


def dir_name_max_len():
    max_len = 0
    try:
        name = "w"
        for i in xrange(1, 10**10):
            name = "w" * i
            os.mkdir(name)
            os.rmdir(name)
            max_len = i
    except OSError as ioe:
        print("Maximum length of directory name is: {}".format(max_len))


if __name__ == '__main__':
    file_name_max_len()
    dir_name_max_len()



Linux下执行结果为:

$ python name_len_test.py
Maximum length of file name is: 255
Maximum length of directory name is: 255

以下测试都是在没有优化或修改内核的前提下测试的结果

1. 测试目的:ext3文件系统下filename最大字符长度
  测试平台:RHEL5U3_x64
  测试过程:
LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
touch $LENTH
当增加到256时,touch报错,File name too long
linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符

2. 测试目的:ext3文件系统下一级子目录的个数限制
  测试平台:RHEL5U3_x64
  测试过程:
[root@fileserver maxdir]# for i in {1..32000};do mkdir $i;done
mkdir: cannot create directory `31999': Too many links
mkdir: cannot create directory `32000': Too many links
ext3文件系统一级子目录的个数为31998(个)。
Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核. 

3. 测试目的:ext3文件系统下单个目录里的最大文件数
  测试平台: RHEL5U3_x64
  测试过程:
  单个目录下的最大文件数似乎没什么特别限制,也是受限于所在文件系统的inode数限制:
  df -i或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode数,后两个命令 
  输出结果是一样的,但是跟df所得出的可用inode数会有些误差,至今不明白什么原因。
  
  网上常用两种解决办法:
  1) 重新mkfs,ext3默认block大小4096 Bytes,block设置小一些inode数设置大一些
  2) 使用loopback文件系统临时解决:
      在/usr中(也可以在别处)创建一个大文件,然后做成loopback文件系统,将原来的文件移到这个
      文件系统中,并将它mount到/usr下合适的位置。这样可以大大减少你/usr中的文件数目。但是系统
      性能会有点损失。

4. 测试目的: 打开文件数限制(文件句柄、文件描述符)
  测试平台: RHEL5U3_x64
  ulimit -n 65535设置,或者/etc/security/limit.conf里设置用户打开文件数、进程数、CPU等

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (623人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------