Jag försöker söka igenom alla underkataloger under en mapp som heter "Man", och lista alla filer som är längre än 10 tecken. Jag har följande kod. När raden strPathName = Dir() körs stannar det och jag får ett meddelande om att Dir inte kan köras på strPathName, hur skriver jag koden för att få den att funka? //Anders Anders, Hej Andreas, Enders Ibland kan det vara bättre att söka på bredden först, i stället för på djupet först som man gör vid rekursion:Söka igenom kataloger
Sub ListLongFileNames
Dim strInitialPathName As String = ("\\NTS\Design\Man\")
Dim strPathName, strOrder, strFileName As String
strPathName = Dir(strInitialPathName, FileAttribute.Directory)
Do While strPathName <> "" ' Kör igenom alla kataloger
strFileName = Dir(strInitialPathName & strPathName, FileAttribute.Normal)
Do While strFileName <> ""
If strFileName.Length > 10 Then Debug.WriteLine(strFileName)
strFileName = Dir()
Loop
strPathName = Dir()
Loop
End SubSv: Söka igenom kataloger
Till att börja med vill jag <b>avråda</b> dig från att använda <b>Dir</b> då det är något som du får tillgång till genom att använda <b>Microsoft.VisualBasic</b> namnrymnden. Det är viktigt att känna till att just Microsoft.VisualBasic namnrymden (med tillhörande <b>assembly</b>) är tänk att erbjuda bakåtkompabilitet från VB6 till programmerare som flyttar över till VB.NET
Problemet med detta är att det gör att man som ny VB.NET programmerare inte bygger upp kunskap om vad själva ramverkat har att erbjuda (sakerna i Microsoft.VisualBasic avänder själv funktionaliteten i ramverket internt).
Så vad du bör titta på är namnrymden <b>System.IO</b> som innehåller allt du behöver för att arbeta med filer och kataloger. Ett enkelt sätt att lösa detta problemet på är att använda <b>rekursion</b>, dvs en funktion som anropar sig själv.
Jag skrev följande kodsnutt för att illustrera detta - den stödjer även att man skickar in hur många tecken som skall tillåtas för att man skall visa filerna, på så sätt kan du återanvända den samt enkelt ändra antalet tillåtnateckan om dina behov skulle ändras
Public Sub DisplayFolder(ByVal Folder As String, ByVal MaxLenght As Integer)
For Each File As String In Directory.GetFiles(Folder)
Dim FileName As String = Path.GetFileName(File)
If (FileName.Length <= MaxLenght) Then
Console.WriteLine(FileName)
End If
Next
For Each Dir As String In Directory.GetDirectories(Folder)
' Här anropar vi metoden igen, dvs samma metod som vi befinner oss
' i fast med nya värden.
DisplayFolder(Dir, MaxLenght)
Next
End Sub
Du anopar metoden med kod som ser ut
DisplayFolder("c:\minkatalog", 10)
Hoppas det löser sig!
Sv:Söka igenom kataloger
Tack för tipset om dir, jag har kikat lite på System.IO och tycker det verkar trevligt, har skapat lite kataloger och kopierat lite filer och det fungerar bra. Har inte provkört koden än. En liten fråga bara. I raden "For Each File As String In Directory.GetFiles(Folder)" deklarerar du en variabel som heter File som en sträng? Det är nog enkelt när man kommer in i det, men det är just det.
Det här med rekursion var intressant oxå. Har jag aldrig använt. Är det vanligt att man använder sig av det, eller är det endast vid specialla tillfällen.
Tackar för ett mycket bra svar och för ett utförligt exempel, Jag ska prova det.
mvh // AndersSv: Söka igenom kataloger
<b>Tack för tipset om dir, jag har kikat lite på System.IO och tycker det verkar trevligt, har skapat lite kataloger och kopierat lite filer och det fungerar bra. Har inte provkört koden än. En liten fråga bara. I raden "For Each File As String In Directory.GetFiles(Folder)" deklarerar du en variabel som heter File som en sträng? Det är nog enkelt när man kommer in i det, men det är just det. </b>
Japp <b>File</b> är en variabel som jag deklarerar som en sträng. <b>GetFiles</b> returnerar en array av strängar där varje sträng är ett filnamn (inklusive sökvägen till den).
<b>Det här med rekursion var intressant oxå. Har jag aldrig använt. Är det vanligt att man använder sig av det, eller är det endast vid specialla tillfällen.</b>
Det är väldigt vanligt, väl värt att läsa på.
<b>Tackar för ett mycket bra svar och för ett utförligt exempel, Jag ska prova det. </b>
det var så lite så =)Sv:Söka igenom kataloger
http://weblogs.asp.net/oldnewthing/archive/2005/02/03/366277.aspxSv: Söka igenom kataloger
Fungerade väldigt bra !
Tack för informationen. Kommer att ha mycket nytta av den nu när jag ska jobba mycket med kataloger och filer.
mvh // Anders