1

変更された時間でソートされたディレクトリの内容を取得しようとしています。呼び出し内でこれを直接行う方法はないと思うdirEntriesので、私の戦略は、すべてのファイルの時間と名前を収集してから、2つの配列をロックステップで並べ替えることです。

sysTime問題1:aを整数に変換する方法がわかりません。
問題2:2つの配列を並列にソートする方法がわかりません。

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

1 に答える 1

8

一般に、C を使用している場合を除き、整数値への変換はお勧めできませんSysTime(さらに、整数値への変換doubleはさらに悪いことです)。time_tしかし、あなたがやっているように本当に変換する必要がある場合は、SysTimetoUnixTime関数を使用してください:

auto timeT = e.timeLastModified.toUnixTime();

あなたがやろうとしていることをするための最も簡単な解決策は、次のようなものです

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

本当に が必要な場合はtime_t、作成してfile.timeLastModified.toUnixTime()ください。

dirEntries範囲を返すので、それを反復して直接操作できますが、並べ替えるには、ランダムアクセス範囲が必要です (dirEntriesファイルに遅延アクセスするため、の結果はそうではありません)。したがって、それを使用std.array.arrayして配列を作成し、それを並べ替えることができます。sort述語を取ります(std.functional、ラムダリテラル、デリゲート、関数ポインター、またはソートしているタイプの2つの引数で呼び出し可能なもので関数に変換された文字列-この場合、文字列を使用しました、および以下の例では、ラムダリテラルを使用しています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()ください。

これにより、時間と名前だけを含むタプルの配列が作成され、それらは時間だけを使用してソートされます。

範囲についてあまり詳しくない場合は、 D に関するオンライン ブックからこの章を読むことをお勧めします。D の標準ライブラリは範囲をかなり頻繁に使用します。範囲は非常に強力な概念ですが、慣れるまでに時間がかかります。

于 2013-03-06T18:40:29.403 に答える