2013-03-06 48 views
1

我想獲取目錄的內容,按修改時間排序。我認爲在dirEntries調用中沒有辦法直接執行此操作,所以我的策略是收集所有文件時間和名稱,然後按鎖步排序這兩個數組。我想不出如何將sysTime轉換爲整數。
問題2:我無法弄清楚如何並行排序兩個數組。在Dlang中獲取按修改日期排序的目錄列表

與在d每一個問題,這是不可能找出如何做到這一點:(

這裏是我的代碼:

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

一般情況下,除非你正在使用C相互作用,我建議將SysTime轉換爲整數值是一個壞主意(並且將其轉換爲double甚至更​​糟)。但是如果您確實需要將它轉換爲time_t(就像您似乎正在做的那樣),那麼只需使用SysTimetoUnixTime函數:

auto timeT = e.timeLastModified.toUnixTime(); 

最簡單的方法做你試圖做會是這樣的

​​

如果你真的想要一個time_t什麼,然後使它file.timeLastModified.toUnixTime()

dirEntries返回一個範圍,所以你可以重複它,就可以直接操作,但爲了對它進行排序,你需要一個隨機存取範圍(其中dirEntries結果不是,因爲它訪問文件懶洋洋)。因此,您可以使用std.array.array從中創建一個數組,然後對其進行排序。 sort需要一個謂詞(可以是一個字符串轉換爲std.functional,lambda文字,委託,函數指針或任何可以調用的類型的兩個參數調用的函數 - 在這種情況下,我使用了一個字符串,在下面的例子中,我使用了一個lambda字面值爲map)。

如果你正在處理大量的文件,並想盡量減少使用的內存量(因爲DirEntry確實有幾個成員變量,所以它們的數組都可能佔用比你想要的更多的內存如果你關心的只是文件的名稱和修改時間),那麼它會變得更有趣,但它仍然是可行的。

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]); 
} 

再次,如果你真的想要一個time_t,只是使pair[0].toUnixTime()

這最終創建了一個包含時間和名稱的Tuples數組,然後按照時間排序。

如果你對範圍不是很熟悉,那麼我建議你從D.D的標準庫使用範圍很大的在線書籍中讀取this chapter,這可能是你爲什麼覺得你很難計算了解如何在D做事情。範圍是一個非常強大的概念,但他們確實需要一些習慣。

+0

哇。這次真是萬分感謝。我認爲在D中發生的事情太多了,很難立足。 – 2013-03-06 21:57:57

+0

我有Alexandrescu關於D的書,但是它的大部分內容都陡峭的學習曲線。我會給你提供一個鏡頭的書。 – 2013-03-06 21:58:44