2013-07-29 35 views
0

我正在开发一个工具,可以根据多种条件删除网络路径上的文件。我想排除某些被检查的路径,并且无法找到合适的方法。无论网络协议如何匹配文件路径

一些路径的程序处理是为如下:

nfs_path = "nfs://Sharepoint/Path/to/Folder/File.ext" 
smb_path = "smb://SERVER/Sharepoint/Path/to/Folder/File.ext" 
afp_path = "afp://server/Sharepoint/Path/to/Folder/File.ext" 
upnp_path = "upnp://277b787b-5b27-b46f-1687-91100ada8d1f/Path/to/Folder/File.ext" 

exclusion = "smb://user:[email protected]/E/Downloads/Path/to/Folder" 

正如你可以看到一些路径的使用凭证,而有的则没有。这些网络路径应该能够彼此匹配。

总之,我想得到确认File.ext,使用任何协议,是Folder(我排除了检查)的一部分。由于我不是具有路径操作或正则表达式的专家,因此我处于困境中。我尝试了下面的正则表达式,这对于NFS路径来说是失败的,因为它也需要共享名称(E)。 UPnP路径完全失败,因为它们的性质完全不同。

"(?P<protocol>((smb|nfs|afp|upnp)://((.+:[email protected])?.+?/)?))?(?P<directory>.+)" 

我也尝试过使用os.path模块,但这些方法似乎并不合适。

在等待一个答案是比较有效的,我建了一个正确的解析正则表达式,将只捕获文件夹结构,而忽略了前缀:

"(?:smb|afp|nfs|upnp)://(?:(?:.+):(?:.+)@)?(?:.+?)/(?P<tail>.*)$" 

任何人都可以点我的更高效的方向进场?我认为这会耗费太多的内存来测试很多不同的文件。

它需要在python 2.6或更低版本上工作,因为它是一个现有程序的插件。

+0

为什么你挑出NFS作为取共享名称时,SMB甚至本地路径还包括“E”?它总是有E吗?你可以拆分第一个'E',并将其余的字符串作为路径,在开始时剥离可选的':'来解释local_path? –

+0

只有当我使用NFS作为正则表达式的输入时,它是否也会使用'E'。我提到的所有其他路径都工作正常,因为正则表达式假定服务器名称,NFS不使用。 共享名称与文件名称不同。用户选择要从检查中排除的路径。如果该路径上有文件,则不应删除它们。 –

+0

你见过'os.path.splitunc'吗?我不在Windows上,所以我无法测试它。 –

回答

0

如果您的网络和本地目录完全相同,则可以使用os.walk(local)通过更改驱动器来获取网络目录。

import os 
networkdir = "Z:\\" 
localdir = "C:\\" 

for dirs,subdirs,files in os.walk(localdir): 
    if os.path.join(localdir,dirs) == excluded: 
     continue 
    for filename in files: 
     localfile = os.path.join(localdir,dirs,filename) 
     networkfile = os.path.join(networkdir,dirs,filename) 

要检查文件是否是一个文件夹中被排除在外:

excludedpath = "C:\excluded\" 
filename = "file.ext" 
os.path.exists(os.path.join(excludedpath,filename)) 
+0

我忘了补充一点,网络路径不会总是作为共享挂载。这是为了尽可能地创造灵活性。另外,我错误地增加了本地路径和网络路径应该可互换的要求。情况并非如此,我已经更新了这个问题来反映这一点。只有(未安装的)网络路径(无论是否带有嵌入凭证)必须可互换。我想这会使你提供的'os.walk'例子失效,对此我很抱歉。 –