gpt4 book ai didi

c# - 在 C#/.NET 中访问超出 MAX_PATH 的文件

转载 作者:太空狗 更新时间:2023-10-29 17:50:12 24 4
gpt4 key购买 nike

背景

我需要编写一个最高使用 .NET 2.0 版的工具(出于政治、商业和 secret /信任原因,此客户端不能使用现成的东西)以将文件从一台服务器迁移到另一台服务器网络。服务器是本地团队的文件服务器,某些团队文件夹需要迁移到其他服务器以方便重组。基本思想是我们读取每个文件并在数小时内通过网络流式传输,几天后数据将被迁移。需要保留文件权限。由于这将花费几天时间(对于某些团队,我们正在讨论数 GB 的数据),因此我们需要每晚遍历文件并比较修改日期并更新已更改的文件。从理论上讲,新服务器最终将拥有文件的最新副本,用户可以切换到新服务器。这当然不是这么简单,但我们有一个我们认为应该可行的设计:)

问题

所以理论上我们只是打开文件,通过网络传输它,然后在另一端写入,对吧? :)

不幸的是,在服务器本身上,文件共享是在如下文件夹路径中创建的:

D:\Data\Team Shares\DIVISION\DEPARTMENT\NAME OF TEAM - COULD BE FAIRLY LONG\

对于每个用户,此路径都映射到一个驱动器,例如,它将共享为\\SERVER\TEAMNAME 并映射到 T: 驱动器。

这导致了从 T: 驱动器可见的文件在 MAX_PATH 限制内的情况,但是当在服务器本身上本地查看时,它们远远超出了限制。我们无法使用网络共享访问文件,因为此工具需要通用,才能在数百台此类服务器上运行,并且没有标准方法来判断哪些文件共享是我们应该移动的,哪些不应该移动 - 有甚至没有命名约定标准。此外,偶尔会有其他共享的子共享,因此我们超过 MAX_PATH 限制两倍!

我知道使用“\\?\”前缀指定路径的解决方法,它将路径视为 UNC 路径并允许理论上最多 32k 个字符。

此解决方法是在 Win32 API 级别实现的,System.IO 命名空间(大部分)基本上只是对 native Win32 API 函数的一个薄包装,但是 Microsoft 在移交调用之前“有帮助”地实现了额外(不正确的)验证到 API。在这种情况下,.NET Framework 拒绝该路径,因为它声称“?”是无效的路径字符。

所以我的问题是......有没有一种我没有想到的方法可以让我解决这个问题而不必完全重写几乎整个 System.IO 命名空间,进行大量 P/Invoke 调用, 只是为了删除这个烦人的验证?

最佳答案

BCL 团队制作了一个由 3 部分组成的系列文章,详细说明了做出这些选择的原因以及解决方法。如果您还没有读过那本书,我建议您读一读,因为它是有关该主题的重要信息来源

关于c# - 在 C#/.NET 中访问超出 MAX_PATH 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1190614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com