鱼C论坛

 找回密码
 立即注册
查看: 8904|回复: 3

[Python][WinError 206]求助对过长路径如何进行 os.chdir() 等一类操作

[复制链接]
发表于 2017-9-13 10:38:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 哲学三信 于 2017-9-16 14:52 编辑
  1. path="sdasdh"#(大于256位)
  2. os.chdir(path)
复制代码

报错
FileNotFoundError: [WinError 206] 文件名或扩展名太长。:

求如何解决,例如增加os.chdir()的支持范围

或者有没有其他方法(不管路径长度)只识别文件夹内 文件 是子文件还是子文件

另外shutil.copyfile()也会有类似的麻烦
不如说基本所有os与os.path的功能都会出错... 没有确定,毕竟不是大神
另外再仔细描述一下问题

  1. import os.path
  2. os.path.isfile(path)
  3. os.path.exists(path)
复制代码

都会返回false,并不能判断过长路径下文件夹或者文件是否存在,

FileNotFoundError: [WinError 206] 文件名或扩展名太长。:
看到这里把文件夹或扩展名太长也归类为FileNotFoundError -路径或文件不存在的错误

但是复制相同的路径,在window地址栏里可以访问和打开文件

是不是需要安装os的扩展模块或者修改os模块才能解决问题呢

@小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-13 11:35:09 | 显示全部楼层
本帖最后由 哲学三信 于 2017-9-13 11:41 编辑

贴一下我用到的代码

  1. def all_subfolder_cheak(work_root_room="",a=1):
  2.         import os
  3.         try:
  4.                 now_may_room = work_root_room+"\"+a+"\"
  5.                 os.chdir(work_root_room)
  6.                 os.chdir(now_may_room)
  7.                 print(os.getcwd())
  8.         except NotADirectoryError:
  9.                 print("目录名无效:{0}  不是子文件夹,开始标记提取".format(a))
  10.                 #开始文件定性
  11.                 check_a = check_copy(a=a)
  12.                 #if check_type() == 1:
  13.                 #else:
  14.                 #k = str(input('输入操作目录:'))
  15.                 pass
  16.         else:
  17.                 #如果是子文件夹则深入
  18.                 inside_dir = os.listdir(now_may_room)
  19.                 for i in inside_dir:
  20.                         subfolder_cheak = all_subfolder_cheak(work_root_room=now_may_room,a=i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-16 17:36:52 | 显示全部楼层
本帖最后由 哲学三信 于 2017-9-16 20:20 编辑

取自os.py代码

  1. import sys, errno
  2. import stat as st

  3. _names = sys.builtin_module_names

  4. # Note:  more names are added to __all__ later.
  5. __all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep",
  6.            "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR",
  7.            "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen",
  8.            "popen", "extsep"]

  9. def _exists(name):
  10.     return name in globals()

  11. def _get_exports_list(module):
  12.     try:
  13.         return list(module.__all__)
  14.     except AttributeError:
  15.         return [n for n in dir(module) if n[0] != '_']
  16. ###省略
  17. elif 'nt' in _names:
  18.     name = 'nt'
  19.     linesep = '\r\n'
  20.     from nt import *
  21.     try:
  22.         from nt import _exit
  23.         __all__.append('_exit')
  24.     except ImportError:
  25.         pass
  26.     import ntpath as path

  27.     import nt
  28.     __all__.extend(_get_exports_list(nt))
  29.     del nt

  30.     try:
  31.         from nt import _have_functions
  32.     except ImportError:
  33.         pass
复制代码


以上分别为判断操作系统之后调用模组
  1. sys.modules['os.path'] = path
  2. from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, devnull)
复制代码

这里os从os.path(位置)调用了很多模组???
以及

  1. if _exists("_have_functions"):
  2.     _globals = globals()
  3.     def _add(str, fn):
  4.         if (fn in _globals) and (str in _have_functions):
  5.             _set.add(_globals[fn])

  6.     _set = set()
  7.     _add("HAVE_OPENAT",     "open")
  8.     supports_dir_fd = _set

  9.     _set = set()
  10.     _add("HAVE_FACCESSAT",  "access")
  11.     supports_effective_ids = _set

  12.     _set = set()
  13.     _add("HAVE_FCHDIR",     "chdir")
  14.     supports_fd = _set

  15.     _set = set()
  16.     _add("HAVE_FACCESSAT",  "access")
复制代码


全局变量中存在"chdir"变量和存在_have_functions模组中方法向集合 _set 中添加元素"chdir"而且下文找不到"chdir"关键字
只在以下位置用了这个集合

  1. if {open, stat} <= supports_dir_fd and {listdir, stat} <= supports_fd:

  2.     def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None):

  3.         orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd)
  4.         topfd = open(top, O_RDONLY, dir_fd=dir_fd)


  5.     def _fwalk(topfd, toppath, topdown, onerror, follow_symlinks):

  6.         names = listdir(topfd)
  7.         dirs, nondirs = [], []

  8.     __all__.append("fwalk")

  9. # Make sure os.environ exists, at least
复制代码



==========================================
自己跑一遍

  1. import sys, errno
  2. import stat as st
  3. from nt import *
  4. from nt import _exit
  5. import ntpath as path
  6. import nt
  7. from nt import _have_functions

  8. sys.modules['os.path'] = path
  9. from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, devnull)
  10. print(globals())
复制代码

摘选结果有
{'path': <module 'ntpath' from 'D:\\Python34\\lib\\ntpath.py'>, 'O_CREAT': 256, 'chdir': <built-in function chdir>, 'listdir': <built-in function listdir>, 'rename': <built-in function rename>, 'replace': <built-in function replace>, 'read': <built-in function read>, 'O_TRUNC': 512, 'O_EXCL': 1024, 'P_OVERLAY': 2, 'O_TEMPORARY': 64, 'O_NOINHERIT': 128, 'O_BINARY': 32768, 'error': <class 'OSError'>, 'open': <built-in function open>, 'TMP_MAX': 32767, 'system': <built-in function system>, 'O_TEXT': 16384, 'P_WAIT': 0, 'P_NOWAIT': 1, 'P_NOWAITO': 3, '_exit': <built-in function _exit>, 'errno': <module 'errno' (built-in)>}


怀疑是
'O_CREAT': 256
的问题





2017.09.16  折腾和研究一圈还是没有用(然而其实还是没看懂) O_等值并不是限制操作长度的

另外求"chdir"这些python内建函数的源码(这里加载出来显示是内建函数,help(os.chdir)可以看到说明却不是在os.py文件里定义的,os.py只有help(os)的一部分说明的源码的位置)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-16 20:15:59 | 显示全部楼层
2017.9.16

尝试把子文件/夹目录过长的上级目录进行压缩处理之后再进行处理,然而无论是对文件夹进行压缩还是拷贝都会用到os 模块

但是如上行为可以通过手工进行,并不是理论上的不可能(超长路径就是来自于压缩文件)

目前似乎唯一的办法是不进行压缩而直接进行更名,不过这样对原数据结构进行了更改
可能存在无法改回或者程序崩溃的数据损伤
考虑如果进行改名为了排除崩溃影响必须得先建立pickle存档/读档回复(好麻烦)并且经过这个组件后再更名

虽然未经尝试不过估计不能回复超长文件名,

而且还得做压缩上上/上上上/....级目录的计划(上级目录可能压缩空间还不足)

还有一种极端情况每级别目录只有一字节而存在超过256级目录,那岂不是无解


综上,总之就是很麻烦,理论上python实现不了对超长目录的处理吗

压缩软件是7z,实在没办法考虑去研究7z是怎么实现的了...orz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表