2010-06-21 87 views
0

首先,我是一名平面設計師,所以如果這個編程問題看起來很愚蠢,請忽略......我知道這個問題可能會一直在分裂成兩個或三個小問題,但因爲我是真正的新的編碼VB.NET它會殺了我想放在一起的東西...列出文件夾中的文件夾 - 然後在JS中爲每個文件夾創建數組 - ASP.NET VB

目錄結構: 我有一個目錄結構如下;

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"]; 

請注意,我不知道的號碼或文件夾的名稱,它們可以在不同的情況不同,我只有根路徑。對不起,聽起來很愚蠢。

我會appriciate任何幫助任何人都可以提供...我是超級新編程,我google瞭如何顯示文件夾內容在VB.net和代碼工作,但無法弄清楚如何創建陣列並僅顯示以「ad_」開頭的文件夾內的文件夾。

Thankyou soooooo much ... :) ...如果任何人需要任何平面設計/ Photoshop的幫助...我會很高興;)...只是讓我知道。



UPDATE: 沒關係......通過google搜索,我知道:

  1. System.IO.DirectoryInfo和System.IO.FileInfo用於獲取的文件夾。

  2. 文字控件可用於在ASP.NET中創建JavaScript數組。這些js數組可以在客戶端使用。

  3. 僞我想要的東西就像是;

 
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_'. 

回答

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> 
+0

哇.... awsome ...像一個魅力的作品...謝謝你謝謝你謝謝!不能相信代碼看起來與我正在工作的東西相比很少....真的很整潔....謝謝你很多:D你做了我的一天! 只是一件小事......我如何獲得另一個名爲adfolders的js數組與所有父文件夾的名稱(即...以'ad_'開頭的文件夾) - 我將能夠計算出這個儘管如此。感謝一束...聽起來很愚蠢,但讓我知道,如果有什麼我可以幫助你。 – Norman 2010-06-22 08:02:00

+0

有沒有一種方法可以按照編號文件夾順序顯示的方式對數組進行排序....目前它們顯示的是這樣的; 「1」,「10」,「2」,「3」,「4」,「5」,「6」,「7」,「8」,「9」 如果可以的話,像; 「1」,「2」,「3」,「4」,「5」,「6」,「7」,「8」,「9」,「10」 謝謝:) – Norman 2010-06-22 12:16:45

+0

OMG .. .. JAWDROPPER !! ...這是一些整潔的代碼:) ...不能等待嘗試! ... 問:你認爲可以建立一個分類器,按win7/xp的順序排列數組,如Windows資源管理器...按字母和數字排序?因爲在一個目錄中有數字和字母文件夾名稱時......這個問題是否有意義? 非常感謝......這將花費我數天的時間來解決......謝謝!謝謝 !謝謝Patricker! – Norman 2010-06-23 05:12:08

0

更新時間:

這是一個糟糕的嘗試添加父文件夾... Patricker已更新他的答案包括創建父文件夾所需的代碼。他的解決方案更簡潔/更簡單/更容易維護,而且更加緊湊!


只需添加以下到第一函數的末尾,這創造了JS數組調用所有的父文件夾的名稱adFolders(這是...的文件夾以「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() 
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,新nameSorter())

我不知道它將如何在情況下的行爲庫不可用(如贏Server 2003或XP及以下的。) - 將如果可以爲圖書館存在一張支票,這很好。

謝謝Patricker!

謝謝, 諾曼。

相關問題