5

最近、ハードドライブがひどくいっぱいになるという問題に遭遇しましたが、個人ファイルを調べてサイズの大きいビデオファイルをすべて削除/移動した後でも、利用可能な ROM の量はまだかなり少ないです。そこで、プログラマーの頭脳を働かせて、各フォルダーとサブフォルダーを自分で細心の注意を払って調べ、Windows の右クリック + プロパティ機能を使用して、ファイルの大きさと保持する価値があるかどうかを確認する代わりに、次のことができると判断しました。コンピューター上のすべてのファイルを検索し、フル パス名でリストに入れ、ファイル サイズをそのすぐ隣に配置し、ファイル サイズの大きいものから小さいものへと並べ替える簡単なコードを作成します。それで私はオンラインに飛び乗って調査を始めました、そしてそれはすべてが私のためにファンを襲ったときです. 私' 指定されたタスクで機能するコード スニペットがたくさん見つかりましたが、それらを自分で使用しようとすると、大量のビルド エラーが発生します。とはいえ、これまでに見つけた最も有望なことは次のとおりです。

const string dir = "C:\\";
string[] fns = Directory.GetFiles(dir);
var Sort = from fn in fns
           orderby new FileInfo(fn).Length descending
           select fn;
foreach (string n in Sort)
    Console.WriteLine(n);

残念ながら、これはサブディレクトリには触れません。サブディレクトリからファイルを取得する方法を調べてみましたが、これらのコード スニペットをこのコードに統合しようとすると、想像以上に面倒でした。トンネルの終わりに光が見えるというまれな機会に、私のプログラムは、明らかに管理者特権 (私は唯一のユーザーであり、したがって私のコンピューターの管理者です) によって保護されていると思われるディレクトリにアクセスし、チンパンジーのようにエラーを吐き出しました。動物園は糞を捨てる。

全体として、私が支援を求めているのは次のとおりです: -コンピュータ上のすべてのファイルを検索するプログラム (「C:/」ドライブから始まると、すべてにアクセスできると想定しています) -各ファイルとそのサイズを取得します、およびそのファイルへのパスを指定し、それをリスト/配列/その他にスローします -ファイル サイズの大きいものから小さいものの順に並べ替えます -このリストを .txt ファイルに配置します

最後の部分については、私は Streamwriter クラスにかなり慣れているので、実際には助けを必要としません。ファイル/パス/サイズのリスト/配列/その他がすべて同じパターンに準拠し、文字列に変換できる場合、その場で作成できる準単純な解析アルゴリズムを使用して、ファイルサイズでソートすることもできます。したがって、私の問題のおよそ 90.23% は、単にすべてのファイルを取得し、管理者保護フォルダーに入る、または無視して続行することです (保護フォルダー内の何かが削除されるべきではないので、それらを無視するのが最善だと思います.)それらすべてのファイルのパスとサイズを取得し、整理します。

4

3 に答える 3

6

GetFiles の別のオーバーロードを試してください。

string[] fns = Directory.GetFiles(dir, "*", SearchOption.AllDirectories);

また、EnumerateFiles を使用すると、より効率的になります。

const string dir = "C:\\";
var Sort = Directory.EnumerateFiles(dir, "*", SearchOption.AllDirectories)
                    .OrderByDescending(f => new FileInfo(f).Length);
foreach (string n in Sort)
{
        Console.WriteLine(n);
}

例外を回避するには:

const string dir = "C:\\";
var fileInfos = new List<FileInfo>();
GetFiles(new DirectoryInfo(dir), fileInfos);
fileInfos.Sort((x, y) => y.Length.CompareTo(x.Length));
foreach (var f in fileInfos)
{
    Console.WriteLine(f.FullName);
}

private static void GetFiles(DirectoryInfo dirInfo, List<FileInfo> files)
{
    // get all not-system subdirectories
    var subDirectories = dirInfo.EnumerateDirectories()
        .Where(d => (d.Attributes & FileAttributes.System) == 0);
    foreach (DirectoryInfo subdirInfo in subDirectories)
    {
        GetFiles(subdirInfo, files);
    }
    // ok, now we added files from all subdirectories
    // so add non-system files from this directory
    var filesInCurrentDirectory = dirInfo.EnumerateFiles()
        .Where(f => (f.Attributes & FileAttributes.System) == 0);
    files.AddRange(filesInCurrentDirectory);
}
于 2012-10-20T14:27:51.357 に答える
1

そこで、プログラマーの頭脳を働かせて、各フォルダーとサブフォルダーを自分で細心の注意を払って調べ、Windows の右クリック + プロパティ機能を使用して、ファイルの大きさと保持する価値があるかどうかを確認するのではなく、コンピューター上のすべてのファイルを検索し、そのファイルをフル パス名でリストに入れ、ファイル サイズをそのすぐ隣に配置し、ファイル サイズの大きいものから小さいものへと並べ替える簡単なコードを書くことができます。

これは楽しいプログラミング演習ですが、目前の問題を解決することが目標である場合は、これを実行してくれる便利なユーティリティがあります: WinDirStat

于 2012-10-20T19:39:25.050 に答える