C# 访问Unicode Windows API的UNC路径不工作

C# 访问Unicode Windows API的UNC路径不工作,c#,unicode,C#,Unicode,我一直在试图找到一种解决方案,用于处理超出常规Windows API(如API)范围的非常长的文件路径。我读了答案中描述的博客,但当使用这种路径格式时,我仍然会遇到路径过长的例外。我做错什么了吗 代码: 注: 上面的应用程序是一个控制台应用程序,用于创建常规Windows API无法访问的文件夹,而不使用Unicode版本的API测试另一个应用程序,该应用程序在文件共享上以不同方式修改文件夹。当它尝试使用UNC Path格式创建文件夹时,代码第26行出现PathToLongException。任

我一直在试图找到一种解决方案,用于处理超出常规Windows API(如API)范围的非常长的文件路径。我读了答案中描述的博客,但当使用这种路径格式时,我仍然会遇到路径过长的例外。我做错什么了吗

代码:

注: 上面的应用程序是一个控制台应用程序,用于创建常规Windows API无法访问的文件夹,而不使用Unicode版本的API测试另一个应用程序,该应用程序在文件共享上以不同方式修改文件夹。当它尝试使用UNC Path格式创建文件夹时,代码第26行出现PathToLongException。任何帮助都将不胜感激

问题摘要:
我需要一种方法来处理超过常规Windows API中文件夹248个字符限制和文件260个字符限制的路径。

您链接到的博客文章强烈暗示\?\格式在.NET代码中不起作用,因为它说如果您想使用它,您必须自己调用Windows API。。。这看起来不像你在做的

我过去使用过的一种解决方法是,使用名为DefinedDevice的本机Windows API函数将驱动器号分配给在点击PathToLongException之前可以到达的最远文件夹,然后使用该驱动器号从此导航到其他子文件夹,因为现在的路径要短得多(完成后,显然要删除此驱动器号)。这对本地路径和网络UNC路径都有效。下面是我对vb.net的DllImport定义:

<DllImport("kernel32.dll", EntryPoint:="DefineDosDeviceW", SetLastError:=True)> _
Public Shared Function DefineDosDevice(ByVal dwFlags As UInteger, <InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal lpDeviceName As String, <InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal lpTargetPath As String) As <MarshalAsAttribute(UnmanagedType.Bool)> Boolean
End Function

看起来有人已经为您做了艰苦的工作,并围绕Windows API制作了一个.NET包装器,让您可以使用长路径:

您可以包含“错误行”吗?@Leonel发生错误的那一行或错误本身?但是,在链接中使用库时,我需要将此库与应用程序一起安装。这是编程中的一种实用方法吗?(诚实的问题)@CalebB我知道你已经接受了我的另一个答案,但是在回答关于在你的程序中部署库的问题时-是的,这是非常正常和实用的。只要创建库的人/公司愿意在你的应用程序中部署它(即,他们不需要为此支付任何版税或许可费)。你所需要做的就是将库DLL文件安装到你的应用程序安装到的同一文件夹中。谢谢你的帮助,我一定会在未来的项目中开始集成这个库或类似的库。我真的很喜欢这个想法。我必须做些工作来转换为C,但我确实喜欢这个概念。我会做一些w今天就做这件事,然后回复你。看起来这至少对这个项目起到了作用。非常感谢你的帮助。
<DllImport("kernel32.dll", EntryPoint:="DefineDosDeviceW", SetLastError:=True)> _
Public Shared Function DefineDosDevice(ByVal dwFlags As UInteger, <InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal lpDeviceName As String, <InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal lpTargetPath As String) As <MarshalAsAttribute(UnmanagedType.Bool)> Boolean
End Function
Public Shared Sub AssignDriveLetterToPath(ByVal DriveLetter As Char, ByVal Path As String)
    If Not ApiDefinitions.DefineDosDevice(0, DriveLetter & ":", Path) Then
        Throw New ComponentModel.Win32Exception
    End If
End Sub

Public Shared Sub RemoveAssignedDriveLetter(ByVal DriveLetter As Char, ByVal Path As String)
    If Not ApiDefinitions.DefineDosDevice(ApiDefinitions.DDD_EXACT_MATCH_ON_REMOVE Or ApiDefinitions.DDD_REMOVE_DEFINITION, DriveLetter & ":", Path) Then
        Throw New ComponentModel.Win32Exception
    End If
End Sub