2014-06-17 48 views
0

請在下面的代碼中查看其工作正常並在給定目錄中搜​​索所有excel文件。但我無法理解此代碼在給定的文件夾或目錄中搜索所有excel文件的VB代碼

疑問:NoOfFolders(Iterator1)是一個動態數組,當再次函數被稱爲fnFolderStructure時,NoOfFolders數組又被創建。但是,即使值NoOfFolders(0)NoOfFolders(1)也發生了變化,但仍然在以前值重新調用其值時。

即使在編寫NoOfFolders(Iterator1)後,它如何保留值。

fnCheckFiles("C:\Temp\Sahil") 

Function fnFolderStructure(sAddress) 
     i=0 
     Dim NoOfFolders() 
     Set objFSO1 = CreateObject("Scripting.FileSystemObject") 
     Set objFolder2 = objFSO1.GetFolder(sAddress) 
     Set FolderIn=objFolder2.SubFolders 
     Set FileIn=objFolder2.Files 

'  If FileIn.Count>0 Then 
'   fnCheckFiles(sAddress) 
'  End If 

    If FolderIn.Count>0 Then  
     y=FolderIn.Count   
     ReDim NoOfFolders(y-1) 

     For Each objSubfolder in FolderIn 
      NoOfFolders(i)= objSubfolder.Name 
      i=i+1 
     Next 

     For Iterator1 = 0 To y-1 
      sPath1=sAddress&"\"&NoOfFolders(Iterator1) 
      fnCheckFiles(sPath1) 
     Next 

'   Set colSubfolders = FolderIn.Subfolders 
'   Call fnFolderStructure(sPath1) 
     End If 
End Function 

Function fnCheckFiles(sAddress) 
      Set objFSO1 = CreateObject("Scripting.FileSystemObject") 
      Set objFolder4 = objFSO1.GetFolder(sAddress)   
      ''sFileName=objFolder4.Name 
      For Each objFile In objFolder4.Files 
       sFileName=objFile.Name    
       if (InStr(1,sFileName,"xlsx",1)) then  
        msgbox objFile.Name  
       End IF  
      Next 


     if objFolder4.SubFolders.Count>0 then 
      fnFolderStructure(sAddress) 
     End if 
End Function 
+0

我不知道如果我滿你理解你的問題,但是如果你重新設定一個數組並且你想保留現有的值,你需要使用redim preserve。除此之外,是否需要將名稱存儲在數組中 - 如果除了在for循環中使用它們以外的任何其他內容,您可能會更容易將for-iterator循環集成到第一個循環中。 –

+0

嗨,我給出的路徑是「C:\ Temp \ Sahil」假設有兩個文件夾A,B。一個文件夾有一個excel表「A.xlsx」和文件夾C.文件夾C有一個excel「C.xlsx」。現在文件夾「C:\ Temp \ Sahil」中的文件夾B有一個文件夾「F」和excel「B.xlsx」。並且文件夾「F」具有優秀的「F.xlsx」。因此,這段代碼將通過調用遞歸函數來命名每個文件夾中的所有excel。並且重新定義NoOfFolders數組並重新賦值new。那麼它如何保持其價值?以及這段代碼如何工作。 - – Sahil

回答

0

它如何能夠甚至 NoOfFolders(的iterator1)

數組沒有被這句話寫到書寫後保留值。陣列NoOfFolders在四個位置使用...

1)聲明值作爲一個動態數組

Dim NoOfFolders() 

2)Redimensions可變匹配的文件夾名稱的數量的大小將持有

ReDim NoOfFolders(y - 1) 

3)將文件夾的名稱分配到數組中的相應位置。這是將值寫入數組的唯一地方。

NoOfFolders(i) = objSubFolder.Name 

4)讀取一個文件夾的名稱從陣列構建的子文件夾

sPath1 = sAddress & "\" & NoOfFolders(Iterator1) 
+0

嗨,我給出的路徑是「C:\ Temp \ Sahil」假設有兩個文件夾A,B。一個文件夾有一個excel表「A.xlsx」和文件夾C.文件夾C有一個excel「C.xlsx」。現在文件夾「C:\ Temp \ Sahil」中的文件夾B有一個文件夾「F」和excel「B.xlsx」。並且文件夾「F」具有優秀的「F.xlsx」。因此,這段代碼將通過調用遞歸函數來命名每個文件夾中的所有excel。並且重新定義NoOfFolders數組並重新賦值new。那麼它如何保持其價值?以及這段代碼如何工作。 – Sahil

+0

fnCheckFolders函數被遞歸調用,因爲它不斷調用每個子文件夾直到找不到更多的子文件夾。每次調用函數時,您關心的數組都不會被重新定義。相反,每次調用函數時都會爲該函數分配新的內存,並且內存保持填充狀態直到您退出該函數。如果你的文件夾結構是三層深的,你最終會在內存中同時出現3個數組,每個數據夾在文件夾結構的這個級別上保存着子文件夾的名字。 – HgCoder

+0

嗨,我明白你說什麼「新內存分配給函數每次它被稱爲」。所以這意味着上面的代碼中的NoOfFolders()數組將在不同級別有不同的值。與NoOfFolders(0)類似,第一級爲A,第三級變爲NoOfFolders(0)「C」。當我執行後回來它時,NoOfFolders(0)將再次有A而不是寫NoOfFolders(o)=「C」。你能否請知道任何這個概念解釋的網站。但非常感謝解釋這一點。給你的帽子:) – Sahil

0
====================================================================================================================*/ 
def getTagValue(def filepath, def tagName,log) 
{ 
    def tagValue = "" 
    try 
    { 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance() 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder() 
     Document doc = docBuilder.parse(filepath) 
     // Get the root element 
     Node company = doc.getFirstChild() 
     NodeList nodes = doc.getElementsByTagName(tagName) 
     //log.info "Nodes length :" +nodes.getLength() 
     Node node = nodes.item(0) 
     //log.info node.getTextContent() 
     tagValue = node.getTextContent() 
     if(tagValue == "") 
     { 
      tagValue = "tag not found" 
     } 
    } 
    catch(Exception e) 
    { 
     log.error e.message 
     tagValue = "tag not found" 
    } 
    return tagValue 
} 

的路徑============= ================= 高清名單readXpaths(DEF expectedExcelPath,高清expectedExcelSheet,日誌,上下文) {

 Fillo.Connection con=getFilloConnection(expectedExcelPath,log) 
     String sQuery="Select * from "+expectedExcelSheet+" where TestCaseName='"+context.testCase.name+"'" 
     //log.info sQuery 

     Recordset rs=getRecordSet(con,sQuery,log) 
     List<String> colList=rs.getFieldNames() 
     colList.remove("TestCaseName") 
     colList.remove("DATA_SET") 
     colList.remove("RUN") 
     List<String> xpaths=new ArrayList<String>() 
     while(rs.next()) 
     { 
      for(String str:colList) 
      {   
       if(rs.getField(str)!="") 
       { 
        xpaths.add(rs.getField(str)) 

       } 
      } 
     } 
     return xpaths; 
    } 
相關問題