簡體   English   中英

列出計算機上的所有文件並按大小排序

[英]Listing all files on my computer and sorting by size

最近,我遇到了一個問題,我的硬盤驅動器令人討厭地裝滿了,但是在瀏覽了我的個人文件並刪除/移動了所有超大的視頻文件后,我仍然有相當數量的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%的問題僅僅是獲取所有文件,進入或忽略並繼續受Admin保護的文件夾(我認為最好忽略它們,因為我高度懷疑應該刪除受保護的文件夾中的任何內容。獲取所有這些文件的路徑和大小,並組織它們。

嘗試另一個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);
}

它必須在C#中嗎? 從命令提示符處嘗試以下操作: dir c: /B /OS /S /4 /ad > fileList.txt

dir命令列出文件,/ B刪除一堆信息,/ OS按(S)大小(-)降序顯示文件,並通過/ S遍歷所有子目錄。/ 4位僅設置年份如果您有上個世紀的檔案,則檔案數會增加到四位數,並且/ ad會清除目錄清單。

因此,我投入了我的程序員的腦筋,並決定不要自己仔細地瀏覽每個文件夾和>子文件夾,而是使用Windows的右鍵單擊+屬性功能查看文件的大小以及是否值得保留它,可以編寫一個簡單的代碼,搜索我的計算機上的每個文件,將其完整路徑名放入列表,然后將其文件大小放在旁邊,然后按文件大小從大到小進行排序。

盡管這是一個有趣的編程練習,但是如果您的目標是解決當前的問題,則有一個不錯的實用程序將為您完成此任務: WinDirStat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM