2013-03-06 2 views
1

디렉토리의 내용을 수정 된 시간순으로 정렬하려고합니다. dirEntries 호출 내에서 직접이 작업을 수행 할 방법이 없다고 생각합니다. 따라서 모든 파일 시간과 이름을 수집 한 다음 잠금 단계에서 두 개의 배열을 정렬하는 것이 좋습니다.디렉토리 목록을 Dlang의 수정 날짜순으로 정렬하기

문제 1 : sysTime을 정수로 변환하는 방법을 알 수 없습니다.
문제 2 : 병렬로 두 개의 배열을 정렬하는 방법을 알 수 없습니다. 당신은 C와 상호 작용하지 않는 한 나는, 일반적으로

import std.file; 
import std.stdio : writeln; 
import std.algorithm; 
import std.datetime; 

void main() { 
    string[] myFiles; 
    double[] myTimes; 

    foreach (DirEntry e; dirEntries("c:/users/istaffel/", SpanMode.shallow)) { 
     // calculate unix time (this doesn't work) 
     auto dur = (cast(Date)e.timeLastModified) - Date(1970,1,1); 

     // store modified time and filename 
     myTimes ~= dur.seconds; 
     myFiles ~= e.name; 
    } 

    // now find a way to sort myFiles in order of ascending myTimes... 

    // print in order 
    for (int i = 0; i < myTimes.length; i++) { 
     writeln(myTimes[i], " ", myFiles[i]); 
    } 
} 

답변

8

: D의 모든 문제와 마찬가지로

, 그것은이 여기

을 :(수행하는 방법을 알아 불가능은 내 코드입니다 SysTime을 정수 값으로 변환하는 것이 나쁜 아이디어라고 제안 할 것입니다. (그리고이 값을 double으로 변환하는 것은 훨씬 더 나쁩니다.) 그러나 실제로 이것을 time_t으로 변환해야한다면, SysTimetoUnixTime 함수를 사용하십시오. :

auto timeT = e.timeLastModified.toUnixTime(); 

가장 간단한 해결 방법은 다음 file.timeLastModified.toUnixTime() 수 있도록, 당신이 정말 time_t을 원하는 뭔가

import std.algorithm; 
import std.array; 
import std.datetime; 
import std.file; 
import std.stdio; 

void main(string[] args) 
{ 
    auto directoryToList = args[1]; 
    auto files = array(dirEntries(directoryToList, SpanMode.shallow)); 
    sort!"a.timeLastModified < b.timeLastModified"(files); 
    foreach(file; files) 
     writefln("%s %s", file.timeLastModified, file.name); 
} 

처럼 그리고 경우 것 뭘 하려는지 할 수 있습니다.

dirEntries은 범위를 반환하므로 범위를 반환하므로 직접 반복하고 정렬 할 수 있지만 정렬하려면 임의 액세스 범위가 필요합니다 (dirEntries의 결과는 파일 느슨하게). 따라서 std.array.array을 사용하여 배열을 만든 다음 정렬 할 수 있습니다. sort은 술어를 취합니다 (std.functional, lambda 리터럴, 대리자, 함수 포인터 또는 정렬 할 유형의 두 개의 인수로 호출 할 수있는 모든 것으로 변환 된 문자열 일 수 있습니다.이 경우에는 문자열이고 아래 예제에서는 map에 대해 람다 리터럴을 사용합니다.

당신이 파일을 많이 다루는 DirEntry 여러 멤버 변수를 가지고로 (사용 된 메모리의 양을 최소화하려면, 당신이 좋아하는 것보다 그래서 그들 모두의 배열보다 더 많은 메모리를 걸릴 수 있습니다 경우 만약 당신이 신경 쓰는 것이 파일의 이름과 수정 시간이라면, 그것은 더 재미있게 느껴지 긴하지만 여전히 가능합니다. 당신이 정말 time_t을 원하는 경우

import std.algorithm; 
import std.array; 
import std.datetime; 
import std.file; 
import std.stdio; 
import std.typecons; 

void main(string[] args) 
{ 
    auto directoryToList = args[1]; 
    auto files = dirEntries(directoryToList, SpanMode.shallow); 
    auto pairs = array(map!(a => tuple(a.timeLastModified, a.name))(files)); 
    sort!"a[0] < b[0]"(pairs); 
    foreach(pair; pairs) 
     writefln("%s: %s", pair[0], pair[1]); 
} 

그리고 또, 단지 pair[0].toUnixTime() 확인하십시오.

이것은 결국 시간과 이름을 포함하는 Tuples의 배열을 생성하고 결국은 시간 만 사용하여 정렬됩니다.

범위에 익숙하지 않은 경우 D. 온라인 라이브러리에서 this chapter을 읽으라고 제안합니다. D 표준 라이브러리는 범위를 상당히 많이 사용하기 때문에 어려움을 겪고있는 것 같습니다. D. Range는 매우 강력한 개념이지만, 익숙해 져야합니다.

+0

와우. 감사합니다. 나는 D에서 그렇게 많이 진행되고있어 발판을 얻는 것이 어렵다고 생각합니다. –

+0

나는 Alexandrescu의 책을 D에 가지고 있지만, 대부분은 너무 가파른 학습 곡선을 가지고있다.내가 제안하는 책을 줄께. –

관련 문제