VB.NET에서이 코드를 작성했지만 C#에서도 편하게 사용할 수 있습니다. Windows 파일 시스템에서 찾고자하는 파일 목록이 있습니다. 파일 이름에 따라 다른 디렉토리를 조사해야합니다. 내가 가지고있는 파일의 목록은 프로그램의 처음에 컴파일 된 목록 (작동)이며 정렬되지 않은 DataTable에 저장됩니다. 여기 내 접근 방식입니다.파일 번호를 줄일 수 있습니까?
파일의 DataTable의 목록 파일 이름을 기준으로 보는
- a_111.txt
- a_222.txt
- b_333.txt
- a_444.txt
- c_555.txt
- b_666.txt
디렉토리 (이것은 1,000 +에서 때로는 매일 매일 다를 수 있음)
C:\a\ -- for files begin with a (variable name is A_folder)
C:\b\ -- for files begin with b (variable name is B_folder)
C:\c\ -- for files begin with c (variable name is C_folder)
코드 :
If DataTableofFiles IsNot Nothing AndAlso DataTableofFiles.Rows.Count > 0 Then
For Each row as DataRow In DataTableofFiles.Rows
If row("FILENAME").ToString.StartsWith("a") Then
Dim a_WriteResultstoA as String = "a.csv"
functionfindfiles(A_folder, row("FILENAME").ToString, a_WriteResultstoA)
ElseIf row("FILENAME").ToString.StartsWith("b") Then
Dim b_WriteResultstoB as String = "b.csv"
functionfindfiles(B_folder, row("FILENAME").ToString, b_WriteResultstoB)
ElseIf row("FILENAME").ToString.StartsWith("C") Then
Dim c_WriteResultstoC as String = "c.csv"
functionfindfiles(C_folder, row("FILENAME").ToString, c_WriteResultstoC)
End If
Next
End If
Private Sub functionfindfiles(sourcefolder As String, filename as String, writetofile As String)
Try
For Each f As String In Directory.EnumerateFiles(sourcefolder, "*.*", SearchOption.AllDirectories) '<-- file enumeration
If Path.GetFileName(f).Equals(filename, StringComparison.OrdinalIgnoreCase) Then
Using fs As New FileStream(writetofile, FileMode.Append, FileAccess.Write, FileShare.Write)
Using sw As StreamWriter = New StreamWriter(fs)
If Not New FileInfo(writetofile).Length > 0 Then
For i As Integer = 0 To DataTableofFiles.Columns.Count - 1 Step 1
sw.Write(DataTableofFiles.Columns(i).ToString)
If i < DataTableofFiles.Columns.Count - 1 Then
sw.Write(",")
End If
Next
sw.WriteLine()
End If
For Each row As DataRow In DataTableofFiles.Rows
If row("FILENAME").ToString = filename Then
For i As Integer = 0 To DataTableofFiles.Columns.Count - 1 Step 1
If Not Convert.IsDBNull(row(i)) Then
sw.Write(row(i).ToString.Replace(vbLf, "").Replace(",", ";"))
End If
If i < DataTableofFiles.Columns.Count - 1 Then
sw.Write(",")
End If
Next
sw.WriteLine()
End If
Next
End Using
End Using
Else
'write results that are not found here to a file
End If
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
이 경우 파일 시스템의 열거는 6 번 발생합니다. 디렉토리에 많은 파일이 있으면 실행 시간이 오래 걸릴 수 있습니다. 파일 열거의 양을 줄이는 더 나은 접근법이 있습니까? 또는 추가 작업을 줄이기 위해 개선 할 수있는 코드의 다른 영역이 필요 이상으로 수행되고 있습니까? 어떤 조언을 크게 주시면 감사하겠습니다. 감사!
foreach 's를 거꾸로 사용하십시오. {foreach (file in EnumerateFiles) {}}',하지만 foreach (EnumerateFiles에있는 파일) {foreach (list에있는 fileName) {}}'로 변환 할 수 있습니다. 메소드의 아키텍처와 호출 방식을 변경해야하지만, 논리적으로 이중 foreach는 모두 수행하고 코드가 모두 인라인되면 'foreach'의 순서를 열거 할 수 있습니다. 한 번만. – Quantic
답장을 보내 주셔서 감사합니다. 순서를 바꾸면 ForEach가 검색 할 때 어떤 "폴더 경로"가 전달 될지 알 수 없습니다. – Jayarikahs