2014-12-14 4 views
0

내 질문 제목을 어떻게 발음할지 잘 모르 셨습니다. 그러나 잘하면이 빠른 것입니다.여러 기준에서 필터 GetFiles()

폴더 안에 여러 개의 PDF 파일이 있습니다. 특정 파일 유형의 최근 수정 날짜 또는 생성 날짜를 가져오고 싶습니다. 내 코드는 작동하지만 모든 PDF 파일의 결과를 제공합니다. 나는 특정 이름의 결과 만 원한다. 예를 들어

. 내 "c : \ temp \"내에는 약 3 개의 첫 글자와 숫자 또는 그 이상의 글자로 시작되는 PDF 파일이 있습니다.

tes8796, fes8897895, bas232와 같은 파일 이름. 등등. 나는 단지 "fes"와 "bas"파일의 결과를 보여주고 싶습니다. "tes"파일을보고 싶지 않습니다 ...

아이디어가 있습니까?

는 나는 내가 단지 전용 "FES"의 결과를 얻으려면이 같은 { "FES * .PDF", "바스 * .PDF"}) 작동

내 코드를 (보여야 믿고 "BAS"뒤마.)

Dim pathx As String = "C:\temp\" 
Dim directory = New DirectoryInfo(pathx) 
Dim from_date As DateTime = DateTime.Now.AddHours(-24) 
Dim to_date As DateTime = DateTime.Now 
Dim files = directory.GetFiles().Where(Function(file) file.LastWriteTime >= from_date AndAlso file.LastWriteTime <= to_date) 
For Each filx In files 
    ListBox1.Items.Add(filx) 
Next 

답변

0

이렇게하는 방법은 여러 가지가있다. 다음 당신의 기능 상태를 확장, directory.GetFiles("*.pdf") : 첫째, 당신은 시작에 PDF 필터를 적용 할 수 있습니다

Dim names() As String = {"fes", "bas"} 

Dim files = di.GetFiles("*.pdf").Where(
     Function(file) (file.LastWriteTime >= from_date _ 
       AndAlso file.LastWriteTime <= DateTime.Now) _ 
        AndAlso (names.Contains(file.Name.ToLowerInvariant.Substring(0, 3))) 
      ) 

For Each filx In files 
    Console.WriteLine(filx) 
Next 

문제는 항상 그리고 영원히 3 개 문자로 이름을 시작하는 파일에 의존한다는 것이다. 또한 코드를 살펴보십시오. 배열을 가져 오면 루프를 통해 ListBox에 게시 할 수 있습니다. 보통 멋진 아이들은 에 LINQ를 사용하여 회 돌이를 피하십시오. 그래서 두 문제를 해결하기 위해 : 나는 이미 DirectoryFile 등의 유형으로 NET에 존재 var에 이름을 제거있어

ListBox1.Items.AddRange(di.GetFiles("*.pdf").Where(
     Function(f) (f.LastWriteTime >= from_date AndAlso f.LastWriteTime <= DateTime.Now) _ 
      AndAlso names.Any(Function(n) f.Name.ToLowerInvariant.StartsWith(n)) 
      ).ToArray) 

. 두 번째 함수는 names 배열을 필터링하고 결과는 으로 바로을 목록 상자 항목 컬렉션으로 펌핑합니다.

거의 모든 경우에, 일반 루프는 빨라집니다 :

Dim myfiles = directory.GetFiles("*.pdf") 
For Each f In myfiles 
    If f.LastAccessTime >= from_date AndAlso f.LastWriteTime <= DateTime.Now Then 
     For Each s As String In names 
      If f.Name.ToLowerInvariant.StartsWith(s.ToLowerInvariant) Then 
       Console.WriteLine(f) 
       Exit For      ' abort when found 
      End If 
     Next 
    End If 
Next 
  • 아마 더 이해 자체에 대한이 VB에서 초보자를 선언했다.NET이 점진적으로 디버깅 할 수
  • 그것이
  • 파일 이름 필터에게 다양한 작동합니다
  • 이 결합이 과정 빠른 시간 (파일 이름 필터의 수를 따라) 100입니다 발견/게시와 필터링 작업은 별도의 루프 제거하기 (Console.WriteLine이 항목에 추가하거나 필요에 따라 목록에 추가 할 수 있습니다.)

을시간 차이가 인지 여부는의 사용 방법과 부하에 따라 다릅니다. 많은 파일을 처리하기 위해 지속적으로 실행되는 경우 문제가 될 수 있습니다. 데스크톱 앱의 일부로, 그렇지 않을 수도 있습니다.

+0

대단히 감사합니다. 나는 일하도록 내 코드를 얻었다. 고맙습니다 – TuckingFypo

0

당신이 오버로드를 호출하고 하나의 패턴이 일치하도록 지정할 수있는 GetFiles 방법. 해당 메서드를 두 번 (각 패턴에 대해 한 번) 호출 한 다음 결과를 결합하거나 다른 호출을 사용하여 모든 파일을 검색 한 다음 Where 필터에 다른 조건을 추가하여 날짜/시간을 필터링 할 수 있습니다. 시각.

+0

나는 VB와 관련하여 많은 것을 알았지 만, 나는 초보자라는 느낌이 든다. 어쩌면 내가 원하는 결과를 얻으려면 편집 해주세요. 또한 두 개가 아닌 더 많은 파일 이름이 있습니다. 감사합니다 – TuckingFypo

0

매우 가까웠습니다. 나는 다음과 같이 할 것이다.