fc5igm 发表于 2021-6-11 15:30:42

关于代码引起的权限不足的问题的询问

使用os.walk可以访问磁盘根目录,但是使用下面自定义函数的代码访问磁盘根目录则会显示权限相关的报错(对磁盘根目录下的子目录使用则没有问题)。
请问这是怎么回事?

def search():
    import os
    index_path=input('请输入待查找的初始目录:')
    os.chdir(index_path)
    f=open('vedioList.txt','w')
    def open_file():
      for i in os.listdir():
            if os.path.splitext(i) in ['.mp4','.rmvb','.avi']:
                f.writelines(str(os.getcwd())+os.sep+i+'\n')
            if os.path.isdir(i):
                os.chdir(i)
                open_file()
                os.chdir(os.pardir)
    open_file()
    f.close()
search()

===================== RESTART: D:\python\works\特异性文件类型搜索.py ====================
请输入待查找的初始目录:D:\
Traceback (most recent call last):
File "D:\python\works\特异性文件类型搜索.py", line 16, in <module>
    search()
File "D:\python\works\特异性文件类型搜索.py", line 14, in search
    open_file()
File "D:\python\works\特异性文件类型搜索.py", line 12, in open_file
    open_file()
File "D:\python\works\特异性文件类型搜索.py", line 11, in open_file
    os.chdir(i)
PermissionError: 拒绝访问。: 'S-1-5-18'
>>> for root, dirs, files in os.walk('D:\\', topdown=True):
    for name in files:
      print(os.path.join(root, name))
    for name in dirs:
      print(os.path.join(root, name))

      
D:\1234.txt
D:\out.log
D:\ReadMe.txt
D:\$RECYCLE.BIN
D:\30b1efe61c9c9b4684d312175e6563f1
D:\Epic
D:\Origin
D:\Program Files
D:\Program Files (x86)
D:\PyCharm 2021.1.2
D:\python
D:\Riot Games
D:\steam
D:\System Volume Information
D:\Unigame
D:\WindowsApps

阿奇_o 发表于 2021-6-11 15:30:43

本帖最后由 阿奇_o 于 2021-6-12 14:28 编辑

fc5igm 发表于 2021-6-12 13:35
但是我函数进的是D盘不是c盘。。

D盘的专用回收目录是 D:\$RECYCLE.BIN
和C盘的不同,我这D盘的$RECYCLE.BIN 可以直接访问改为当前工作目录,但不能写入,就是这样怪~

反正,就是特定权限的问题。。原因应该就是这个,具体怎样我就不管了。
这种特殊目录,没必要深究,知道是因为 os.chdir() 不能访问这种目录就行了。

或自己想办法获得对这些特殊文件的程序访问权,只是有没有这个必要。。

阿奇_o 发表于 2021-6-11 16:43:10

本帖最后由 阿奇_o 于 2021-6-11 16:45 编辑

附件是我修改权限的大概过程,你可以参考一下,根据自己的情况来修改,windows的权限管理太那个了,
我之前遇到类似的权限问题,也是折腾、搜索了好几圈中外网,最后才解决了……
说多了都是泪,哈哈{:10_250:}你再试试吧。

ps: 这里提供了四种不同的处理办法,第四种提到有可能是python特定版本的bug
你可以参考一下 https://techisours.com/winerror-5-access-is-denied-fixed-completely/

fc5igm 发表于 2021-6-12 01:07:06

阿奇_o 发表于 2021-6-11 16:43
附件是我修改权限的大概过程,你可以参考一下,根据自己的情况来修改,windows的权限管理太那个了,
我之 ...

不是。但是你这个还是没有解释为什么os.walk可以有权限在根目录运行,而我自己敲的代码就不可以啊?

阿奇_o 发表于 2021-6-12 12:06:00

本帖最后由 阿奇_o 于 2021-6-12 13:10 编辑

fc5igm 发表于 2021-6-12 01:07
不是。但是你这个还是没有解释为什么os.walk可以有权限在根目录运行,而我自己敲的代码就不可以啊?

哦,那个,我这模拟搜索运行了一下,没报错,结果也正确。

我看你的报错信息,估计是你磁盘回收站有点特殊情况,试一下清空回收站或用火绒等安全工具清理一下垃圾,看看能不能解决这个奇怪的 "S-1-5-18"垃圾残余


---- 不对,原来 ‘S-1-5-18’ 是一个特殊的 垃圾回收站目录,具体位置是: C:\$Recycle.Bin\S-1-5-18

这样的目录用 os.chdir("C:\$Recycle.Bin\S-1-5-18" ) 就会报 拒绝访问的错误!

比较怪的是,你直接在窗口地址栏访问"C:\$Recycle.Bin”也会被拒绝,但你可以直接访问"C:\$Recycle.Bin\S-1-5-18"(回收站目录)

我想试了一下修改其权限,但担心造成其他安全问题,所以就放弃了。。

os.walk()并没有进入到"C:\$Recycle.Bin\S-1-5-18" ,也没有进入"C:\$Recycle.Bin" 。os.walk() 只是列出有哪些文件(夹)


{:10_261:} {:10_250:}

fc5igm 发表于 2021-6-12 13:35:24

阿奇_o 发表于 2021-6-12 12:06
哦,那个,我这模拟搜索运行了一下,没报错,结果也正确。

我看你的报错信息,估计是你磁盘回收站有 ...

但是我函数进的是D盘不是c盘。。

fc5igm 发表于 2021-6-12 13:36:04

阿奇_o 发表于 2021-6-12 12:06
哦,那个,我这模拟搜索运行了一下,没报错,结果也正确。

我看你的报错信息,估计是你磁盘回收站有 ...

你这边跑我那个函数代码,在磁盘根目录用,没有报错吗?

fc5igm 发表于 2021-6-13 15:56:59

阿奇_o 发表于 2021-6-12 14:26
D盘的专用回收目录是 D:\$RECYCLE.BIN
和C盘的不同,我这D盘的$RECYCLE.BIN 可以直接访问改为当前工 ...

>>> os.chdir('D:\\$RECYCLE.BIN\\S-1-5-18')
Traceback (most recent call last):
File "<pyshell#324>", line 1, in <module>
    os.chdir('D:\\$RECYCLE.BIN\\S-1-5-18')
PermissionError: 拒绝访问。: 'D:\\$RECYCLE.BIN\\S-1-5-18'
>>> for root, dirs, files in os.walk("D:\\$Recycle.Bin"):
    for name in files:
      print(os.path.join(root, name))

      
D:\$Recycle.Bin\S-1-5-21-1915546489-2114559664-3400814273-1001\desktop.ini
你说的对,的确是chdir无法跳转。可能根源在chdir函数与walk函数的源代码的区别上

fc5igm 发表于 2021-6-13 16:01:18

阿奇_o 发表于 2021-6-11 15:30
D盘的专用回收目录是 D:\$RECYCLE.BIN
和C盘的不同,我这D盘的$RECYCLE.BIN 可以直接访问改为当前工 ...

>>> for root, dirs, files in os.walk("D:\\$RECYCLE.BIN\\S-1-5-18"):
    for name in files:
      print(os.path.join(root, name))

      
>>>
这个目录如果用walk函数访问,会直接返回空值。chdir想来的确本身就不是用来搜索用的函数。最初使用这个函数也是因为还没学walk函数。函数作者应该自身明白一些相关限制,让walk函数可以直接跳过这种的文件夹,而chdir未对此限制,从而引发的报错
页: [1]
查看完整版本: 关于代码引起的权限不足的问题的询问