Windows 10中open()对已存在文件抛FileNotFoundError,Windows 7正常,原因何在?
嘿,这种跨Windows版本的文件访问坑我踩过不少,结合经验来看,大概率是下面这几个原因导致的,你可以挨个排查试试:
路径大小写敏感差异
虽然Windows系统整体是大小写不敏感的,但Windows 10允许对单个NTFS文件夹开启大小写敏感设置。如果你的代码里写的路径和实际文件的大小写不一致(比如代码里是C:\TestFile.txt,实际是C:\testfile.txt),Windows 7会自动匹配,但Windows 10如果目标文件夹开了大小写敏感,就会直接抛出找不到文件的错误。你可以右键目标文件夹→属性→安全→高级→查看是否开启了大小写敏感,或者直接把代码里的路径改成和文件完全一致的大小写试试。UAC文件重定向搞的鬼
Windows 10的UAC(用户账户控制)比Windows 7严格很多,当你以普通权限访问系统目录(比如C:\Program Files、C:\Windows)时,系统会自动把请求重定向到C:\Users\[你的用户名]\AppData\Local\VirtualStore这个虚拟目录。如果你的文件实际在原系统目录,但代码访问的是原路径,Windows 7可能没触发重定向,而Windows 10会让你访问虚拟目录里的文件(如果没有就报错)。你可以去虚拟目录里找找有没有对应文件,或者右键以管理员身份运行你的程序再测试。长路径支持未开启
Windows传统路径长度限制是260字符,Windows 7某些版本可能通过补丁或默认设置支持了长路径,但Windows 10默认可能没开这个功能。如果你的文件路径超过260字符,Windows 10就会抛出FileNotFoundError,而Windows 7能正常访问。要启用长路径支持的话,打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,把LongPathsEnabled这个DWORD值改成1(没有的话就新建一个),重启系统后再试。权限不足被伪装成“文件不存在”
Windows 10的权限管控更严格,比如用户隐私文件夹、某些系统保护目录,即使文件存在,你的程序没有读取权限,系统也会抛出FileNotFoundError(而不是直接提示权限不足)。你可以右键目标文件→属性→安全选项卡,检查当前用户是否有“读取”权限,或者给用户添加相应的读取权限试试。非ASCII路径的编码问题
如果文件路径包含中文、特殊符号这类非ASCII字符,Windows 10和Windows 7对路径编码的处理可能有差异。比如代码里用了错误的编码解析路径,导致传递给open()的是乱码路径,Windows 7容错性强能识别,Windows 10就直接找不到了。如果是Python代码,你可以试试显式指定编码或者用原始字符串,比如open(r"C:\中文文件夹\测试文件.txt", encoding="utf-8")。
内容的提问来源于stack exchange,提问作者R01k

