簡體   English   中英

如何從具有指定長度的可變擴展名的目錄中獲取所有文件?

[英]How to I get all files from a directory with a variable extension of specified length?

我有一個巨大的目錄,我需要從包括子目錄中檢索文件。

我的文件是包含各種文件的文件夾,但我只對以長度為 7 位的擴展名命名的特定專有文件感興趣。

例如,我有一個包含以下文件的文件夾:

abc.txt
def.txt
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
summary.pdf
someinfo.zip
T7F4JUXA.0300600
vxy98796.csv
YJHLPLBO.0302300
YJHLPLUC.0302800  

我嘗試了以下方法:

var fileList = Directory.GetFiles(someDir, "*.???????", SearchOption.AllDirectories)

並且

string searchSting = string.Empty;
for (int j = 0; j < 9999999; j++)
{
  searchSting += string.Format(", *.{0} ", j.ToString("0000000"));
}

var fileList2 = Directory.GetFiles(someDir, searchSting, SearchOption.AllDirectories);

哪些錯誤是因為字符串顯然太長了。

我只想返回具有指定擴展名長度的文件,在本例中為 7 位數字,以避免循環處理我必須處理的數千個數字。

我考慮過為搜索條件創建一個可變字符串,該字符串將包含所有 99,999,999 個可能的數字,但 d

我怎樣才能做到這一點?

我不相信有一種方法可以在不循環訪問目錄及其子文件夾中的文件的情況下執行此操作。 GetFiles的搜索模式不支持正則表達式,因此我們不能真正使用[\d]{7}之類的東西作為過濾器。 我建議使用Directory.EnumerateFiles ,然后返回符合您條件的文件。

您可以使用它來枚舉文件:

private static IEnumerable<string> GetProprietaryFiles(string topDirectory)
{
    Func<string, bool> filter = f =>
    {
        string extension = Path.GetExtension(f);
        // is 8 characters long including the .
        // all remaining characters are digits
        return extension.Length == 8 && extension.Skip(1).All(char.IsDigit);
    };

    // EnumerateFiles allows us to step through the files without
    // loading all of the filenames into memory at once.
    IEnumerable<string> matchingFiles =
        Directory.EnumerateFiles(topDirectory, "*", SearchOption.AllDirectories)
            .Where(filter);
                    
    // Return each file as the enumerable is iterated
    foreach (var file in matchingFiles)
    {
        yield return file;
    }
}

Path.GetExtension包括. 所以我們檢查字符數,包括. 是 8,並且所有剩余的字符都是數字。

用法:

List<string> fileList = GetProprietaryFiles(someDir).ToList();

我只想獲取目錄中的文件列表,然后檢查“.”之后的 substring 長度是否為 substring。 等於 7。(* 只要您知道沒有其他文件會具有該長度擴展名)

編輯改為使用 Path :

Directory.GetFiles(@"C:\temp").Where(
    fileName => Path.GetExtension(fileName).Length == 8
    ).ToList();

老的:

Directory.GetFiles(someDir).Where(
         fileName => fileName.Substring(fileName.LastIndexOf('.') + 1).Length == 7
).ToList();

files視為Directory.GetFiles()結果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        List<string> files = new List<string>()
        {"abc.txt", "def.txt", "GIWFJ1XA.0201000", "GIWFJ1UC.0501000", "NOOBO0XA.0100100", "summary.pdf", "someinfo.zip", "T7F4JUXA.0300600", "vxy98796.csv", "YJHLPLBO.0302300", "YJHLPLUC.0302800"};
        Regex r = new Regex("^\\.\\d{7}$");
        foreach (string file in files.Where(o => r.IsMatch(Path.GetExtension(o))))
        {
            Console.WriteLine(file);
        }
    }
}

Output:

GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
T7F4JUXA.0300600
YJHLPLBO.0302300
YJHLPLUC.0302800

編輯:我試過(r.IsMatch)而不是使用o但 do.netfiddle 編譯器給我錯誤提示

Compilation error (line 14, col 27): The call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,bool>)' and 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int,bool>)'

由於我現在很忙,無法調試它,如果路過的任何人對此提出任何修復建議,我會很高興。 但是上面的當前代碼有效。

暫無
暫無

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

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