Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在DOT-NET中访问文件夹名称非常慢-或文件夹迭代速度问题_.net_Vb.net_File_Path_Directory - Fatal编程技术网

.net 在DOT-NET中访问文件夹名称非常慢-或文件夹迭代速度问题

.net 在DOT-NET中访问文件夹名称非常慢-或文件夹迭代速度问题,.net,vb.net,file,path,directory,.net,Vb.net,File,Path,Directory,一段时间以来,我一直在努力解决VPN上非常缓慢的文件夹枚举问题。尽管Net4改进了一些东西,但我仍然存在一些重大问题 事实证明(在我编写了对findfirst/next的PINVOKE API调用之后),问题实际上在于文件夹(或文件)本身的名称 我测试过的文件夹包含一个波浪形字符(~”)——我用它作为分隔符之一来标识文件名中的字段——这些文件是计算机生成和访问的,允许我在不打开它们的情况下查找相关文件。tilde不在文件或文件夹的非法字符列表中,也不是用户经常使用的,而且我认为大于31就足够安全

一段时间以来,我一直在努力解决VPN上非常缓慢的文件夹枚举问题。尽管Net4改进了一些东西,但我仍然存在一些重大问题

事实证明(在我编写了对findfirst/next的PINVOKE API调用之后),问题实际上在于文件夹(或文件)本身的名称

我测试过的文件夹包含一个波浪形字符(~”)——我用它作为分隔符之一来标识文件名中的字段——这些文件是计算机生成和访问的,允许我在不打开它们的情况下查找相关文件。tilde不在文件或文件夹的非法字符列表中,也不是用户经常使用的,而且我认为大于31就足够安全了

在我所有的初始测试中,它都很好(项目日期为2009年),但直到我添加了VPN访问

这个问题的答案是,当使用(\)UNC名称时,NET例程PATH.GETDIRECTORYNAME和DirectoryInfo(x).Name都会进入LA-LA land相当长的一段时间(但只有在那时)

奇怪的是,文件夹或文件甚至不必存在,因此实际上没有目录或文件夹被访问,所以不是Windows正在搜索或其他任何东西,尽管我怀疑它与Windows~short filename系统链接

我在下面添加了测试代码。蜂鸣音用作定时测试的断点

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    beep

    Dim x as String = "\\unc\path\foldername\filename.txt"
    Dim y as String = "\\unc\path\folder~name\filename.txt"

    for tindex as integer = 1 To 500

        'Dim m_info =new DirectoryInfo(x).Name
        Dim m as String = Path.GetDirectoryName(x)

    Next

    beep
    end
End Sub
如果在参数中使用X,则得到的结果为2500ms

请注意,如果您指定一个c:\例如,问题就消失了-大概这对于映射驱动器是正确的(我使用映射驱动器时不会太担心勒索软件)


我是否丢失了过载、开关、windows设置等,或者这是一个网络错误?

我将在这里尝试猜测,因为我目前无法正确测试它。如果我看一下的代码,它会调用一个名为NormalizePath的函数,一旦找到一个tilde,他们就会调用该函数

                // For short file names, we must try to expand each of them as
                // soon as possible.  We need to allow people to specify a file 
                // name that doesn't exist using a path with short file names 
                // in it, such as this for a temp file we're trying to create:
                // C:\DOCUME~1\USERNA~1.RED\LOCALS~1\Temp\bg3ylpzp 
                // We could try doing this afterwards piece by piece, but it's
                // probably a lot simpler to do it here.

该函数调用Win32Native.GetFullPathName和其他Win32Native函数。我想这就是让你慢下来的原因。它看到了~字符,认为这是一条短路径,并试图找到长路径。找不到长路径并具有句柄/忽略该错误。如果在本地驱动器上处理路径,该进程可能会运行得更快;如果在网络路径上(或者在我的情况下是不存在的网络路径),该进程可能会运行得更慢。

谢谢您提供的信息。我怀疑这可能是原因。最后,我编写了字符串扩展名等价物,它只是检查tilde的路径,并临时替换一个未使用的字符(因为没有实际的文件夹访问)。这似乎是成功的。正如您所建议的-本地驱动器不受影响,这就是我被抓住的原因。@user2063785我不确定您的程序的目标是什么。也许您可以使用Path.GetFileName(速度很快)获取文件名,并将其从字符串中删除。或者获取该路径中所有文件夹的列表,而不是搜索特定文件夹。