[英]Recursively fetch all files from shared folder using Python
我已经使用 Pywin32 建立了与 Windows 共享驱动器的连接
import win32net
data = {
'remote': r"\\server\shared",
'local': '',
'username': 'username',
'password': 'password'
}
win32net.NetUseAdd(None, 2, data)
我需要列出共享文件夹中存在的所有文件,类似于os.walk(path)
。
有哪些可能的方法可以做到这一点?
检查[ME.TimGolden]: Python for Win32 Extensions Help
((官方)由[GitHub] 引用:mhammond/pywin32 - Python for Windows (pywin32) Extensions是Python wrapper ove WinAPI s)。
win3.net.NetUseAdd包装[MS.Learn}: NetUseAdd function (lmuse.h) 。
[MS.Learn]:USE_INFO_2 结构 (lmuse.h) (由[ME.TimGolden] 包装:PyUSE_INFO_2 Object - 您使用的)指出:
ui2_local
类型: LMSTR
指向包含本地设备名称(例如,驱动器 E 或 LPT1)的字符串的指针被重定向到共享资源。 常量 DEVLEN 指定字符串中的最大字符数。 该成员可以是NULL 。 有关详细信息,请参阅以下备注部分。
您所要做的就是:
提供一个本地名称(未使用)
连接成功后,使用它(就像任何“常规”本地驱动器一样)
代码00.py :
#!/usr/bin/env python
import os
import sys
import win32net as wnet
def main(*argv):
local_drive = "y:"
data = {
"remote": r"\\localhost\share_cfati",
"local": local_drive,
"username": "user", # @TODO - cfati: Modified to hide sensitive data
"password": "***", # @TODO - cfati: Modified to hide sensitive data
}
try:
res = wnet.NetUseAdd(None, 2, data)
#print(res)
except:
print("Error adding connection:", sys.exc_info())
return -1
print("Items in the shared folder:\n{:}".format(os.listdir(local_drive)))
if __name__ == "__main__":
print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("\nDone.\n")
sys.exit(rc)
Output :
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q075267137]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> [prompt]>.net share Share name Resource Remark ------------------------------------------------------------------------------- ADMIN$ C:\WINDOWS Remote Admin C$ C:\ Default share E$ E:\ Default share F$ F:\ Default share G$ G:\ Default share H$ H:\ Default share IPC$ Remote IPC L$ L:\ Default share M$ M:\ Default share N$ N:\ Default share share_cfati L:\Share\cfati share_pub_ro L:\Share\pub_ro share_pub_rw L:\Share\pub_rw The command completed successfully. [prompt]> [prompt]>.net use New connections will not be remembered. There are no entries in the list. [prompt]> [prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.10_test0\Scripts\python.exe"./code00.py Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32 Items in the shared folder: ['.DS_Store', 'a.py', 'b', 'c', 'code00.py', 'commander.dmg', 'copy_sdk-aars.sh', 'cstrike1.6.zip', 'dedus', 'doublecmd.xml', 'ifm', 'pula', 'py2713.tgz'] Done. [prompt]> [prompt]>.net use New connections will not be remembered. Status Local Remote Network ------------------------------------------------------------------------------- OK Y: \\localhost\share_cfati Microsoft Windows Network The command completed successfully. [prompt]> [prompt]>.net use /delete y: y: was deleted successfully. [prompt]> [prompt]>.net use New connections will not be remembered. There are no entries in the list.
注意事项:
这相当于Win UI中的Map.network drive...功能
通常,当资源用完后,最好释放它。 我删除了连接( net use /delete y:
),但这也可以通过 win3.net.NetUseDel* 从代码中完成
文件(文件夹)浏览本身不是这个问题的一部分(至少我不认为是),因为它是一个不同的(独立的)主题。 检查[SO]:如何列出目录的所有文件? (@CristiFati 的回答)以深入分析如何做
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.