背景
我需要使用最高版本的 .NET 2.0 编写一个工具(出于政治、商业和机密性/信任的原因,此客户端不能使用现成的东西)通过网络将文件从一台服务器迁移到另一台服务器。服务器是本地团队的文件服务器,某些团队文件夹需要迁移到其他服务器以方便重组。基本思想是我们读取每个文件并在数小时内通过网络将其流式传输,几天后数据将被迁移。需要保留文件权限。由于这将需要几天时间(对于某些团队,我们正在讨论数 GB 的数据),我们需要每晚迭代文件并比较修改日期并更新已更改的文件。理论上,最终新服务器将拥有文件的最新副本,并且用户可以切换到新服务器。当然不是这么简单,但我们有一个我们认为应该可行的设计:)
问题
所以理论上我们只是打开文件,通过网络流式传输,然后在另一端写入,对吗?:)
不幸的是,在服务器本身上,文件共享是在文件夹路径中创建的,例如:
D:\Data\Team Shares\DIVISION\DEPARTMENT\团队名称 - 可能相当长\
对于每个用户,此路径都映射到一个驱动器,例如,它将作为 \\SERVER\TEAMNAME 共享并映射到 T: 驱动器。
这导致了从 T: 驱动器可见的文件在MAX_PATH
限制范围内的情况,但是当在服务器本身上本地查看时,它们远远超出了限制。我们无法使用网络共享访问文件,因为该工具需要通用,才能在数百个这样的服务器上运行,并且没有标准的方法来判断哪些文件共享是我们应该移动的,哪些不是 - 有甚至没有命名约定标准。另外,偶尔会有其他股份的子股份,所以我们MAX_PATH
两次超过限额!
我知道使用“\\?\”前缀指定路径的解决方法,它将路径视为 UNC 路径并允许理论上最多 32k 个字符。
此解决方法是在 Win32 API 级别实现的,System.IO 命名空间(大部分)基本上只是原生 Win32 API 函数的薄包装,但是微软在将调用交给 API 之前“有用地”实现了额外的(不正确的)验证. 在这种情况下,.NET Framework 拒绝该路径,因为它声称“?” 是无效的路径字符。
所以我的问题是......有没有一种我没有想到的方法可以让我解决这个问题,而不必完全重写几乎整个 System.IO 命名空间,进行大量 P/Invoke 调用,只是为了删除这个烦人的验证?