문제

System.IO.Directory.GetFiles() 반환합니다 string[].반환된 값의 기본 정렬 순서는 무엇입니까?이름으로 추측하고 있는데 그렇다면 현재의 문화는 어느 정도 영향을 미치고 있을까요?생성일 등으로 변경할 수 있나요?

업데이트: MSDN은 .Net 3.5에서는 정렬 순서가 보장되지 않지만 페이지의 2.0 버전에서는 아무 말도 하지 않으며 두 페이지 모두 생성 또는 수정 시간과 같은 항목을 기준으로 정렬하는 데 도움이 되지 않는다고 지적합니다.배열이 있으면 해당 정보는 손실됩니다(문자열만 포함).가져오는 각 파일을 확인하는 비교자를 만들 수 있지만 이는 .GetFiles() 메서드가 이미 이 작업을 수행할 때 파일 시스템에 반복적으로 액세스한다는 의미입니다.매우 비효율적인 것 같습니다.

도움이 되었습니까?

해결책

CreationTime과 같은 파일 속성에 관심이 있다면 System.IO.DirectoryInfo.GetFileSystemInfos()를 사용하는 것이 더 합리적입니다.그런 다음 System.Linq의 확장 메서드 중 하나를 사용하여 이를 정렬할 수 있습니다. 예:

DirectoryInfo di = new DirectoryInfo("C:\\");
FileSystemInfo[] files = di.GetFileSystemInfos();
var orderedFiles = files.OrderBy(f => f.CreationTime);

편집 - 죄송합니다. .NET2.0 태그를 발견하지 못했으므로 LINQ 정렬을 무시하십시오.System.IO.DirectoryInfo.GetFileSystemInfos()를 사용하라는 제안은 여전히 ​​유효합니다.

다른 팁

.NET 2.0에서는 FileSystemInfo를 정렬하려면 Array.Sort를 사용해야 합니다.

또한 비교용 클래스를 선언할 필요가 없도록 Comparer 대리자를 사용할 수 있습니다.

DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] files = dir.GetFileSystemInfos();

// sort them by creation time
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b)
                                    {
                                        return a.LastWriteTime.CompareTo(b.LastWriteTime);
                                    });

제가 사용한 VB.Net 솔루션은 다음과 같습니다.

먼저 날짜를 비교하는 클래스를 만듭니다.

Private Class DateComparer
    Implements System.Collections.IComparer

    Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo)
        Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo)

        Dim Date1 As DateTime = FileInfo1.CreationTime
        Dim Date2 As DateTime = FileInfo2.CreationTime

        If Date1 > Date2 Then Return 1
        If Date1 < Date2 Then Return -1
        Return 0
    End Function
End Class

그런 다음 배열을 정렬하는 동안 비교자를 사용하십시오.

Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\")
Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles()
Dim comparer As IComparer = New DateComparer()
Array.Sort(Files, comparer)

Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)

에서 msdn:

반환된 파일 이름의 순서는 보장되지 않습니다.특정 정렬 순서가 필요한 경우 Sort() 메서드를 사용하세요.

그만큼 종류() 메서드는 IComparables(다른 오버로드 중에서)를 가져오는 표준 Array.Sort()이므로 생성 날짜별로 정렬하면 컴퓨터 설정에 따라 지역화를 처리합니다.

맞습니다. 기본값은 내 이름 asc입니다.FileInfo 컬렉션에서 데이터 테이블을 생성하기 위해 정렬 순서를 변경하는 유일한 방법입니다.

그런 다음 데이터 테이블에서 DefaultView를 사용하고 .Sort 메서드로 디렉터리를 정렬할 수 있습니다.

이것은 매우 복잡하고 상당히 느리지만 누군가가 더 나은 솔루션을 게시하기를 바랍니다.

사용자 정의 iComparer를 구현하여 정렬을 수행할 수 있습니다.파일에 대한 파일 정보를 읽고 원하는 대로 비교하세요.

IComparer comparer = new YourCustomComparer();
Array.Sort(System.IO.Directory.GetFiles(), comparer);

msdn 정보 IComparer 인터페이스

좀 더 간결한 VB.Net 버전은...아주 좋습니다.감사합니다.목록을 역순으로 탐색하려면 reverse 메서드를 추가하세요.

For Each fi As IO.FileInfo In filePaths.reverse
  ' Do whatever you wish here
Next

그만큼 MSDN 문서 반환 값에 대한 순서가 보장되지 않음을 나타냅니다.Sort() 메소드를 사용해야 합니다.

사용자 정의 IComparer 인터페이스를 작성하여 생성 날짜별로 정렬한 다음 이를 Array.Sort에 전달할 수 있습니다.Explorer가 사용하는 정렬(텍스트와 함께 숫자를 올바르게 정렬)을 수행하는 데 사용되는 StrCmpLogical도 살펴보고 싶을 것입니다.

생성 날짜 등을 기준으로 정렬하려면 DirectoryInfo.GetFiles를 사용한 다음 적합한 조건자를 사용하여 결과 배열을 정렬해야 할 수 있습니다.

그냥 아이디어입니다.나는 쉬운 방법을 찾고 이미 사용 가능한 리소스를 다시 사용하는 것을 좋아합니다.파일을 정렬하려면 프로세스를 만들고 syscal을 "DIR [x:\Folders\SubFolders*.*] /s /b /on"으로 만들고 출력을 캡처하면 됩니다.

시스템의 DIR 명령을 사용하면 다음을 기준으로 정렬할 수 있습니다.

/O          List by files in sorted order.
sortorder    N  By name (alphabetic)       S  By size (smallest first)
             E  By extension (alphabetic)  D  By date/time (oldest first)
             G  Group directories first    -  Prefix to reverse order

The /S switch includes sub folders

D = By Date/Time이 LastModifiedDate 또는 FileCreateDate를 사용하고 있는지 확실하지 않습니다.그러나 필요한 정렬 순서가 DIR 명령에 이미 내장되어 있으면 syscall을 호출하여 이를 얻습니다.그리고 그것은 빠릅니다.나는 단지 게으른 사람일 뿐이다 ;)

약간의 인터넷 검색 끝에 특정 날짜/시간별로 정렬하는 스위치를 찾았습니다.

/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. 

Value Description 
c : Creation
a : Last access
w : Last written

누구든지 관심이 있다면 더욱 간결한 VB.Net 버전

Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _
  New DirectoryInfo("c:\temp").GetFiles() _
   .OrderBy(Function(f As FileInfo) f.CreationTime)
For Each fi As IO.FileInfo In filePaths
  ' Do whatever you wish here
Next
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top