尝试使用 Micropython 遍历(遍历)esp32 的目录

Trying to traverse (walk) the directory of an esp32 using Micropython

```
# try.py
import uos
dir = 16384

def walk(t): # recursive function
    print('-',t)
    w = uos.ilistdir(t)
    for x in w:
        L = list(x)
        print(L[0], L[1], L[3])
        if L[1] == dir:
            walk(L[0])
        else:
            return
    

z = uos.ilistdir()
for x in z:
    L = list(x)
    print(L[0], L[1], L[3])
    if L[1] == dir:
        walk(L[0])

```

代码在第7行报错停止,报错:

输出:

Traverse.py 32768 773

boot.py 32768 139

库 16384 0

-库

一个 16384 0

-一个

回溯(最近调用最后):

中的文件“stdin”,第 21 行

文件“stdi>”,第 12 行,正在运行

文件“

OSError: [Errno 2] ENOENT

目录结构为:

one

    two

        three

    three.py

boot.py

main.py

one.py

Traverse.py

好像停在了一个没有文件的目录上

没有要测试的 ESP,但这里有一些问题:

  • 如果条目是一个文件,你不应该 return 而是继续,这就是它停止得太快的原因
  • 你应该跳过当前目录和父目录以避免无限递归
  • 当递归时你必须在顶层目录之前,这可能是错误的原因,即你的代码调用 walk('two') 但没有这样的目录,它必须是 one/two)
  • 您可以在当前目录上使用 walk 函数,这样就不需要在最后一点复制实现了。

此外:

  • 迭代 ilistdir returns tuples 也可以被索引所以不需要将它转换成 list
  • 并将集合直接传递给 print 也可以,不需要单独的 print(x[0], x[1], ...)

Adpatation,完整路径的打印略有不同,因此更容易理解:

import uos

dir_code = 16384

def walk(t):
    print('-', t)
    for x in uos.ilistdir(t):
        print(x)
        if x[1] == dir_code and x[0] != '.' and x[0] != '..':
            walk(t + '/' + x[0])
    
walk('.')

这仍然会打印目录两次,添加所有索引使内容难以阅读。适配元组解包打印目录一次:

import uos

dir_code = 16384

def walk(top):
    print(top)
    for name, code, _ in uos.ilistdir(top):
        if code != dir_code:
            print(top + '/' + name)
        elif name not in ('.', '..'):
            walk(top + '/' + name)
    
walk('.')