我原来一直用dir来获得一个目录下的一级目录列表,后来发现有数量限制(32768),超过就溢出了:<求一算法获得某目录下一级目录的列表,只要一级目录的列表。

解决方案 »

  1.   

    我原来就是用dir控件,最多32767个一级目录,再往下就溢出了,我还是想不用控件,用算法实现。
      

  2.   

    Option Explicit
    '引用Microsoft Scriptint Runtime
    Private Sub Command1_Click()
        Dim f As New FileSystemObject
        Dim fd As Folder
        Dim childfolder As Folder
        
        Set fd = f.GetFolder("c:\winnt")
        For Each childfolder In fd.SubFolders
            List1.AddItem childfolder.Name
        Next
    End Sub
      

  3.   

    呵呵,还没遇到超过32767的
    .net里面变量的范围都比vb扩了一倍,是不是dir也可以装更多?有环境的可以帮着试试,我可没有几万个文件夹的目录
      

  4.   

    list1.count 也只能到32765  这个太慢了!
    dir1.count  也只能到32765  这个速度快
    怎么是负的.好像目录又加载完了的.
      

  5.   

    list1.count 也只能到32765  这个太慢了!
    //我试过可以到40000
      

  6.   

    dirlistbox可以列出32767以上的目录,但dir1.listcount已经是负数了...  而且引用dir1.list(32767以上)就溢出了,环境是winxp+vb6.0,谢谢 lxcc(虫子|专注于抢分) 的算法,不过我不想使用FileSystemObject(norton报警,挺烦的),而且一直写绿色软件,除了标准控件我只用api,我想要api的一段算法来实现,先谢了
      

  7.   

    Shell.Application没找到相关的方法呀,提示一下呀用了半天,没找到文件夹方法...而且Shell.Application能实现,那么api也应该能实现呀...
      

  8.   

    The ProgID for each of the Shell objects is shown in the following table.Object ProgID 
    DIDiskQuotaUser Microsoft.DiskQuota.1 
    DiskQuotaControl Cannot late bind 
    Folder Shell.Application.NameSpace("...") 
    Folder2 Shell.Application.NameSpace("...") 
    FolderItem Shell.Application.NameSpace("...").Self or 
    Folder.Items.Item or Folder.ParseName 
    FolderItems Folder.Items 
    FolderItems2 Folder.Items 
    FolderItemVerb Shell.NameSpace("...").Self.Verbs.Item(i)  
    FolderItemVerbs FolderItem.Verbs or 
    Shell.NameSpace("...").Self.Verbs 
    IShellDispatch2 Shell.Application 
    IShellLinkDual2 Shell.NameSpace("...").Self.GetLink or 
    Shell.NameSpace("...").Items(i).GetLink  
    Shell Shell.Application 
    ShellFolderItem Shell.NameSpace("...").Self or 
    Shell.NameSpace("...").Items(i)  
    ShellFolderView Cannot late bind 
    ShellFolderViewOC Cannot late bind 
    ShellLinkObject Shell.NameSpace("...").Self.GetLink or 
    Shell.NameSpace("...").Items(i).GetLink 
    ShellUIHelper Cannot late bind 
    ShellWindows Shell.Windows or 
    ShellWindows._NewEnum 
    WebViewFolderContents Cannot late bind
      

  9.   

    我一般用 lxcc(虫子|专注于抢分)的方法呵呵
      

  10.   

    Private Sub Form_Load()
        Dim sPath As String, sName As String    sPath = "C:\"
        sName = Dir$(sPath, vbDirectory + vbNormal + vbHidden + vbArchive + vbReadOnly + vbSystem)
        Do While sName <> ""
            If sName <> "." And sName <> ".." Then
                List1.AddItem sName
            End If
            sName = Dir$()
        Loop
        
    End Sub
      

  11.   

    Private Sub Command1_Click()
        Dim objShell, objFolder, subFolder
        
        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.namespace("c:\winnt")
        
        For Each subFolder In objFolder.Items
            List1.AddItem subFolder.Name
        Next
        
        Set objFolder = Nothing
        Set objShell = Nothing
        Set subFolder = Nothing
    End Sub
      

  12.   

    to: wstar(星) ( ) 
    vb中的integer是有符号数,超过了32768就要溢出啦,你用一个long 来存储就可以了。
    vb连无符号数都不提供,挺烦的
      

  13.   

    你可以试一下WINAPI涵数:FINDFIRSTFILE FINDNEXT,可以的.
      

  14.   

    \\后来发现有数量限制(32768),超过就溢出了:<\\
    这个问题是listbox的问题.它只可以存最多32768条记录.你可以换个控件来显示,不是DIR的问题.
      

  15.   

    \\后来发现有数量限制(32768),超过就溢出了:<\\
    这个问题是listbox的问题.它只可以存最多32768条记录.你可以换个控件来显示,不是DIR的问题.可能我说的不清楚,我用的是dirlistbox,他和listbox 一样,都不能返回32767以后的目录名字....
      

  16.   

    to: wstar(星) ( ) 
    vb中的integer是有符号数,超过了32768就要溢出啦,你用一个long 来存储就可以了。
    vb连无符号数都不提供,挺烦的是dirlistbox的问题,你可以试一试,一个目录(C:\test)下有40000个目录,然后
    dim i,k as long
    dim j as string
    dir1.path="c:\test"
    k=dir1.listcount
    for i=0 to 40000
    j=dir1.list(i)
    next i
    超过32767就溢出了,呵呵,而且dir1.listcount是负数...
      

  17.   

    非常感谢 leolan(史留香) 和 lxcc(虫子|专注于抢分) ,可是你们的程序返回的是所有文件和目录,我不要文件,怎么区分?
      

  18.   

    Private Sub Form_Load()
        Dim sPath As String, sName As String    sPath = "C:\"
        sName = Dir$(sPath, vbDirectory)
        Do While sName <> ""
            If sName <> "." And sName <> ".." Then
                If GetAttr(sPath & sName) And Not vbArchive Then
                    List1.AddItem sName
                End If
            End If
            sName = Dir$()
        Loop
        
    End Sub
      

  19.   

    leolan(史留香)  超级感谢,这次真是受益匪浅,再感谢 lxcc(虫子|专注于抢分) ,jiangsheng(蒋晟.MSMVP2004Jan) 等等,谢谢,结贴