首先,我是一名平面设计师,所以如果这个编程问题看起来很愚蠢,请忽略......我知道这个问题可能会被分成两三个较小的问题,但是因为我对VB编码很新.NET它会杀死我试图整理这些东西......
目录结构: 我有一个目录结构如下;
ad_folder
--folderA
--folderB
--folderC
--anotherFolder
--etcfolder
--afile.aspx
--anotherfile.gif
ad_code
--folderA
--folderB
--afile.aspx
--anotherfile.gif
ad_prep
--folderA
--etcfolder
--afile.aspx
--anotherfile.gif
ad_bin
--etcfolder
--afile.aspx
--anotherfile.gif
other Folder
files folder
assetsfolder
index.aspx
web.config
image.gif
手头的任务:
我希望VB.NET中的代码能够创建文件夹内容的javascript数组,然后可以在客户端使用。 我只需要以ad _ 开头的文件夹中包含的所有文件夹的数组,以及所有基本文件夹的数组。像这样:
var folders=["ad_folder","ad_code","ad_prep","ad_bin"];
var ad_folder=["folderA","folderB","folderC","anotherFolder","etcfolder"];
var ad_code=["folderA","folderB"];
var ad_prep=["folderA","etcfolder"];
var ad_bin=["etcfolder"];
请注意,我不知道文件夹的数量或名称,它们在不同情况下可能有所不同,我只有根路径。抱歉听起来很蠢。
我会赞美任何人都可以提供的任何帮助......我是编程的新手,我已经搜索了如何在VB.net中显示文件夹内容并且代码工作但是无法弄清楚如何创建数组并仅显示以“ad _”开头的文件夹中的文件夹。
非常感谢soooooo ... :) ...如果有人需要任何图形设计/ photoshop帮助...我会很高兴;)...让我知道。
更新: 好的...通过谷歌搜索我知道:
用于获取文件夹的System.IO.DirectoryInfo和System.IO.FileInfo。
可以使用文字控件在ASP.NET中创建javascript数组。然后可以在客户端使用这些js数组。
伪我想要的东西就像是;
declare path if path exists and is not empty then ' get all folders starting with 'ad_' ' if folders starting with 'ad_' are > 0 ' loop through all folders starting with 'ad_' ' ' if this folder exists and not empty ' ' get all folders within this folder ' ' create literal control for javascript array named 'this folder's name' ' create literal control for javascript array called 'folders' containing names of all folders starting with 'ad_'.
答案 0 :(得分:1)
编辑:我看到您确定了如何包含父文件夹数组,但我继续更新了我的答案以包含它。我还在你要求的排序中添加了,虽然我不确定它是否能像你想要的那样工作,但请告诉我。
我相信下面的代码会做你想要的。重要的一行是响应写入GetJavaFolderArrays的行。把它放在你想要输出javascript数组的地方。在我的例子中,我将它放在一个javascript块中,这对我来说很有意义:))
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<script runat="server">
Private dirArray As String = "var {0}=[{1}];"
Protected Function GetJavaFolderArrays(ByVal RootPath As String) As String
'get all folders starting with ad_'
Dim adFolders() As String = Directory.GetDirectories(RootPath, "ad_*")
'sort using numbers'
Array.Sort(adFolders, New PathNumberSorter())
'string builder to hold the output'
Dim sb As New StringBuilder()
'build parent folder list
sb.AppendLine(GetADFolder("folders", adFolders))
'loop through folders'
For Each d As String In adFolders
sb.AppendLine(GetADFolder(Path.GetFileName(d), Directory.GetDirectories(d)))
Next
'return the string builder'
Return sb.ToString()
End Function
Protected Function GetADFolder(ByVal ParentName As String, ByVal cf() As String) As String
'sort the array'
Array.Sort(cf, New PathNumberSorter())
'javascript array'
Dim jarray As String = String.Empty
'loop through folders'
For Each d As String In cf
jarray += String.Format("""{0}"",", Path.GetFileName(d))
Next
'remove extra ,'
jarray = jarray.Trim(",")
Dim jfinal As String = String.Format(dirArray, ParentName, jarray)
Return jfinal
End Function
Friend Class PathNumberSorter
Implements IComparer(Of String)
'used for finding all numbers in string'
Private pattern As String = "[0-9]+"
Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
'get number from x and y
Dim xMatch As RegularExpressions.Match = Regex.Match(Path.GetFileName(x), pattern)
Dim yMatch As RegularExpressions.Match = Regex.Match(Path.GetFileName(y), pattern)
If xMatch.Success And yMatch.Success Then
Dim xInt As Integer = Convert.ToInt32(xMatch.Value)
Dim yInt As Integer = Convert.ToInt32(yMatch.Value)
Return xInt.CompareTo(yInt)
Else
Return x.CompareTo(y)
End If
End Function
End Class
</script>
<form id="form1" runat="server">
<script type="text/javascript">
<%=GetJavaFolderArrays(Server.MapPath("~/"))%>
</script>
<div>
</div>
</form>
</body>
</html>
答案 1 :(得分:0)
<强>更新强>
这是一个糟糕的尝试添加父文件夹... Patricker更新了他的答案,包括创建父文件夹所需的代码。他的解决方案更整洁/更简单/更容易维护,而且更加紧凑!
刚刚在第一个函数的末尾添加了以下内容,这会创建名为adFolders的js数组,其中包含所有父文件夹的名称(即以'ad_'开头的文件夹)
谢谢Patricker!
'create array for parent folders'
Dim parray As String = String.Empty
For Each d As String In adFolders
parray +=enter code here String.Format("""{0}"",", Path.GetFileName(d))
Next
'remove extra ,'
parray = parray.Trim(",")
parray = String.Format(dirArray, "adFolders", parray)
sb.AppendLine(parray)
'return the string builder'
Return sb.ToString()
答案 2 :(得分:0)
Patricker,
我问了另一个问题来修复排序...使用Josh在这里回答的代码;
http://stackoverflow.com/questions/3099581
我能够在Windows中对浏览器中的所有文件夹名称进行排序。效果很好! ......
Public Class nameSorter
Implements IComparer(Of String)
Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _
ByVal s1 As String, _
ByVal s2 As String) As Int32
Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
Return StrCmpLogicalW(x, y)
End Function
End Class
上面的这个分类器可用于对任何数组资源管理器样式进行排序,如此;
Array.Sort(cf,New nameSorter())
我不确定如果库不可用(例如在win server 2003或xp及以下版本中)它会如何表现。 - 如果可以为库存在进行检查,那将会很好。
谢谢Patricker!
谢谢, 诺曼。