আপনি একাধিক ফিল্টার সহ ডিরেক্টরি.গেটফায়ার্স () কল করতে পারেন?


353

আমি Directory.GetFiles()একাধিক ধরণের ফাইলের তালিকা, যেমন mp3'গুলি এবং jpg' গুলি এর পুনরুদ্ধার করার জন্য পদ্ধতিটি ব্যবহার করার চেষ্টা করছি । আমি ভাগ্য নির্বিঘ্নে নিম্নলিখিত দুটি চেষ্টা করেছি:

Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);

এক কল এ কি উপায় আছে?


3
পার্শ্ব দ্রষ্টব্য হিসাবে, এক্সটেনশানটি ফিল্টার করার জন্য গেটফায়ার্স অনুসন্ধানের প্যাটার্ন ব্যবহার করা নিরাপদ নয় instance উদাহরণস্বরূপ আপনার কাছে দুটি ফাইল টেস্ট.এক্সএলএস এবং টেস্ট 2.xlsx রয়েছে এবং আপনি অনুসন্ধান প্যাটার্ন * .xls ব্যবহার করে এক্সএলএস ফাইল ফিল্টার করতে চান তবে গেটফিলস দুটিই টেস্ট 1 ফিরবে .xls এবং Test2.xlsx। আরও তথ্যের জন্য নোট বিভাগটি পড়ুন
কিরণ

তাহলে কীভাবে এটি প্রতিরোধ করবেন?
বন্ধনী 19

2
@kiran কীভাবে এটি নিরাপদ নয়? এটি বাগের চেয়ে বৈশিষ্ট্যের মতো দেখাচ্ছে।
কাইল ডেলাানি

উত্তর:


519

.NET 4.0 এবং তারপরে,

var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

.NET এর পূর্ববর্তী সংস্করণগুলির জন্য

var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

সম্পাদনা: মন্তব্য পড়ুন। পল ফেরি যে উন্নতির পরামর্শ দেয় এবং মেমরি / পারফরম্যান্স ইস্যু করে যে ক্রিশ্চিয়ান.কে দেখায় উভয়ই অত্যন্ত গুরুত্বপূর্ণ।


10
ম্যান, আমাকে প্রায়শই লিনকিউ-র শর্তে ভাবতে হবে। চমৎকার সমাধান!
কেন পেসপিসা

61
কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি এর অর্থগুলি বুঝতে পেরেছেন: এটি স্ট্রিং অ্যারেতে সমস্ত ফাইল ফেরত দেবে এবং তারপরে আপনার নির্দিষ্ট করা এক্সটেনশানগুলি দ্বারা ফিল্টার করবে। এটি "সি: \ পাথ" এর নীচে প্রচুর ফাইল না থাকলে এটি কোনও বড় সমস্যা নাও হতে পারে, তবে "সি: \" এর একটি স্মৃতি / পারফরম্যান্স সমস্যা হতে পারে বা এর মতো কিছু হতে পারে।
খ্রিস্টান.কে

24
... 2 বছর পরে: দুর্দান্ত কোড, তবে এটি দেখুন, যদি আপনার কাছে একটি ফাইল থাকে যা .জেপিজি দিয়ে শেষ হয় এটি এটি তৈরি করবে না। আরও ভাল অ্যাডs.ToLower().Endswith...
স্টোরমনেট

107
আপনি কেবল ব্যবহার করতে পারেনs.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)
পল ফেরি

119
লক্ষ্য করুন .NET 4.0 সঙ্গে, আপনি প্রতিস্থাপন করতে পারেন Directory.GetFilesসঙ্গে Directory.EnumerateFiles, msdn.microsoft.com/en-us/library/dd383571.aspx , যা মেমরির বিষয় @ Christian.K উল্লেখ করেছেন যে এড়াতে হবে।
জিম মিসেল 22

60

এটি সম্পর্কে:

private static string[] GetFiles(string sourceFolder, string filters, System.IO.SearchOption searchOption)
{
   return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter, searchOption)).ToArray();
}

আমি এটি এখানে (মন্তব্যে) পেয়েছি: http://msdn.microsoft.com/en-us/library/wz42302f.aspx


আমি অনুমান করছি যে এটি শীর্ষ রেট করা উত্তরের সম্ভাব্য মেমরির ক্ষতিগুলি এড়িয়ে চলেছে? কোন ক্ষেত্রে, এটি উচ্চতর রেটিং করা উচিত!
ড্যান ডব্লু

11
@ ড্যানডাব্লু শীর্ষ রেট করা উত্তর অবশ্যই স্মৃতিতে বোঝা ফেলেছে তবে আমি মনে করি যে এ জাতীয় সমস্যা হওয়া উচিত নয়। আমি এই উত্তরটিও পছন্দ করেছি, তবে এটি গ্রহণযোগ্য উত্তরের চেয়ে ধীরে ধীরে ধীরে ধীরে (অনেক বেশি)। এই চেক করুন SpeedTest
আতর

ধন্যবাদ। এটি প্রায় দ্বিগুণ হিসাবে ধীর দেখে খুশি - আমি মনে করি এর মধ্যে আমি এটির সাথে থাকব।
ড্যান ডব্লু

7
কেবলমাত্র দুটি এক্সটেনশন থাকলে এটি দ্বিগুণ হয়ে যায়। যদি আপনার এক্স এক্সটেনশনের একটি তালিকা থাকে তবে এটি এক্স গুণ বেশি ধীর হবে। কারণ আপনি এখানে ফাংশনটি ডাইরেক্টরি.গেটফায়ারগুলি কয়েকবার কল করছেন, অন্য সমাধানে এটি কেবল একবার ডেকে আনা হয়েছে।
অস্কার হার্মোসিলা

1
@ অস্কারহর্মোসিলা Parallel.ForEachতাদের সমান্তরালভাবে পেতে ব্যবহার করতে পারেন
FindOutIslam এখন

33

আপনার কাছে এক্সটেনশনের একটি বৃহত তালিকা থাকলে যাচাই করে আপনি নীচেরটি ব্যবহার করতে পারেন। আমি প্রচুর OR স্টেটমেন্ট তৈরি করতে চাইনি তাই লেট কী লিখেছিল তা আমি সংশোধন করেছিলাম।

string supportedExtensions = "*.jpg,*.gif,*.png,*.bmp,*.jpe,*.jpeg,*.wmf,*.emf,*.xbm,*.ico,*.eps,*.tif,*.tiff,*.g01,*.g02,*.g03,*.g04,*.g05,*.g06,*.g07,*.g08";
foreach (string imageFile in Directory.GetFiles(_tempDirectory, "*.*", SearchOption.AllDirectories).Where(s => supportedExtensions.Contains(Path.GetExtension(s).ToLower())))
{
    //do work here
}

দয়া করে আমাকে এটিতে সহায়তা করুন ... যখন আমি চিত্র মুদ্রণ করি তখন এটি এর পুরো পথ দেয় H আমি কেবল ফাইলটির নামেই এটি সঙ্কুচিত করতে পারি।
নরেশ

1
System.IO.Path.GetFileName (চিত্র ফাইল)
jnoreiga

Path.GetExtension'.ext', '* .xt' নয় (কমপক্ষে 3.5+ এ) প্রদান করে।
4:44 এ 12

2
অবগতির জন্য: আপনি জন্য .where (System.Linq প্রয়োজন
jnoreiga

1
একটি সম্ভাব্য ত্রুটি আছে। আমরা অনেক দিন অতিবাহিত করেছি যেখানে এক্সটেনশানগুলির জন্য ঠিক তিনটি অক্ষর হওয়া দরকার। মনে করুন আপনি কোনও ফাইলের মুখোমুখি হতে পারেন .abc, এবং এতে সমর্থিত এক্সটেনশন রয়েছে .abcd। মিলবে, যদিও এটি করা উচিত নয়। ঠিক করতে: supportedExtensions = ".jpg|.abcd|";সাথে .Contains(Path.GetExtension(s).ToLower() + "|")। অর্থাৎ পরীক্ষায় আপনার বিভাজক চরিত্রটি অন্তর্ভুক্ত করুন। গুরুত্বপূর্ণ: আপনার বিভাজক চরিত্রটি সমর্থিত মতামতের সর্বশেষ প্রবেশের পরেও হওয়া আবশ্যক।
টুলমেকারস্টেভ

31

জন্য

var exts = new[] { "mp3", "jpg" };

আপনি করতে পারেন:

public IEnumerable<string> FilterFiles(string path, params string[] exts) {
    return
        Directory
        .EnumerateFiles(path, "*.*")
        .Where(file => exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase)));
}

EnumerateFilesআপনি যখন ফিল্টারগুলি বিভক্ত করবেন এবং ফলাফলগুলি মার্জ করবেন তখন আসল সুবিধাটি দেখাবে:

public IEnumerable<string> FilterFiles(string path, params string[] exts) {
    return 
        exts.Select(x => "*." + x) // turn into globs
        .SelectMany(x => 
            Directory.EnumerateFiles(path, x)
            );
}

আপনার যদি এগুলিকে গ্লোবগুলিতে পরিণত করতে না হয় (তবে exts = new[] {"*.mp3", "*.jpg"}ইতিমধ্যে) এটি কিছুটা দ্রুত হয় ।

নিম্নলিখিত লিনকপ্যাড পরীক্ষার উপর ভিত্তি করে পারফরম্যান্স মূল্যায়ন (দ্রষ্টব্য: Perfকেবলমাত্র প্রতিনিধিকে 10000 বার পুনরাবৃত্তি করে) https://gist.github.com/zaus/7454021

(পুনরায় পোস্ট করা হয়েছে এবং 'সদৃশ' থেকে প্রসারিত করা হয়েছে যেহেতু এই প্রশ্নটি নির্দিষ্টভাবে কোনও লিনকইউয়ের অনুরোধ করেনি: একাধিক ফাইল-এক্সটেনশানগুলির অনুসন্ধানের ব্যবস্থা সিস্টেমের জন্য। IO.Directory.GetFiles )


"যদি আপনি এগুলিকে গ্লোবগুলিতে পরিণত করতে না চান তবে আমি কিছুটা দ্রুত হয়ে উঠি" এর অর্থ কী? এটি ও (1) বা এটি ও (এন) (ফাইলগুলির সংখ্যার ক্ষেত্রে, এক্সটেনশনের সংখ্যা নয়)? আমি অনুমান করতাম যে এটি হে (1) (বা ও (এন) এক্সটেনশনের সংখ্যার ক্ষেত্রে)) এবং সম্ভবত কোথাও কয়েকটি সিপিইউ-চক্রের মধ্যে রয়েছে ... যদি এটি হয় তবে এটি সম্ভবত - পারফরম্যান্স অনুসারে
উপেক্ষিত

@ ব্যাটারিব্যাকআপ ইউনাইটে হ'ল 10 কে রেপ সহ 2 টি এক্সটেনশনের বিপরীতে গ্লোব বনাম স্ট্রফের পার্থক্য 3 মিমি, তাই হ্যাঁ প্রযুক্তিগতভাবে তুচ্ছ (পারফরম্যান্সের লিঙ্কটি দেখুন), তবে আপনার জন্য কতগুলি এক্সটেনশন ফিল্টার করতে হবে তা না জেনে এটি বুঝতে পারা যায় যে সেখানে একটি আছে পার্থক্য; "সরলীকৃত ব্যবহার" (যেমন .FilterFiles(path, "jpg", "gif")) "সুস্পষ্ট গ্লোবস" (অর্থাত .FilterFiles(path, "*.jpg", "*.gif")) এর চেয়ে ভাল কিনা তা সিদ্ধান্ত নেওয়ার জন্য আমি এটি আপনার উপর ছেড়ে দিই ।
ড্রাজস

নিখুঁত, ধন্যবাদ দুঃখিত আমি কোনওভাবে সেই গিথুব লিঙ্কটি এড়িয়ে গেছি। হয়তো আমার আমার পর্দার রঙিন সেটিংস মানিয়ে নেওয়া উচিত :)
ব্যাটারিব্যাকআপ ইউনিট

এটি কি বড় হাতের এক্সটেনশনকে যেমন গাধা .JPG বা .MKV সমর্থন করে?
ওয়াহিউ

1
সিলেক্টম্যানির সমাধানের ত্রুটিটি হ'ল এটি প্রতি ফাইলের এক্সটেনশানটি একবারে পাস করার পরে সমস্ত ফাইলের মধ্যে পুনরাবৃত্তি হবে
26

16

আমি জানি এটি পুরানো প্রশ্ন তবে লিনকিউ: (.NET40 +)

var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));

3
ভাল ধারণা. file.ToLower()সহজেই আপার-কেস এক্সটেনশনের সাথে মেলে ব্যবহার করার কথা বিবেচনা করুন । এবং প্রথমে এক্সটেনশানটি কেন না কেন, তাই রেজেক্সকে পুরো পথ পরীক্ষা করতে হবে না: Regex.IsMatch(Path.GetExtension(file).ToLower(), @"\.(wav|mp3|txt)");
টুলমেকারস্টেটিভ

13

এখানে একটি অবতীর্ণ সমাধানও রয়েছে যা মনে হয় কোনও মেমরি বা পারফরম্যান্সের ওভারহেড নেই এবং বেশ মার্জিত হবে:

string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();

1
আমি মনে করি আমি এটি সম্পাদনা করতে পারলাম যাতে এটি নতুন স্ট্রিং ভেরিয়েবল এবং একটি স্প্লিট ফাংশন সহ অজানা সীমাহীন সংখ্যক এক্সটেনশন গ্রহণ করে। তবে তারপরেও, এটি জোনরিগের সমাধানের চেয়ে কীভাবে ভাল? এটা কি দ্রুত? কম স্মৃতি গ্রাস?
বন্ধনীতে

1
একটি বাণিজ্য বন্ধ আছে। এই পদ্ধতির মাধ্যমে প্রতি ফিল্টারে একাধিকবার গেটফিলস কল হয়। এই একাধিক কলগুলি কিছু পরিস্থিতিতে তাত্পর্যপূর্ণ "পারফরম্যান্স ওভারহেড" হতে পারে, এটির গুরুত্বপূর্ণ সুবিধাটি হ'ল প্রতিটি গেটফিলস কেবলমাত্র ফাইলের পাথের সাথে মিলিয়ে একটি অ্যারে প্রদান করে। আমি আশা করব এটি সাধারণত একটি ভাল পারফরম্যান্স ফলাফল হতে পারে, এমনকি উচ্চতর পারফরম্যান্সও হতে পারে তবে এটি পরীক্ষা করা দরকার। যদি গেটফায়ালগুলি এনিউমারেট ফাইলগুলির চেয়ে উল্লেখযোগ্যভাবে দ্রুত হয় তবে এটি এখনও সেরা পন্থা হতে পারে। এছাড়াও নোট করুন যে চূড়ান্ত ".ToArray ()" বাদ দিতে পারে যখন IEnumerable সরাসরি ব্যবহারযোগ্য হয়।
টুলমেকারস্টেভ

11

লিনক ব্যবহারের আরেকটি উপায়, তবে মেমরিতে সেই সমস্ত কিছুই ফিরিয়ে না নিয়ে এবং ফিল্টার না করে।

var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));

এটি আসলে 2 টি কল GetFiles(), তবে আমি মনে করি এটি প্রশ্নের আত্মার সাথে সামঞ্জস্যপূর্ণ এবং এগুলি একটি গণনামূলক হিসাবে ফিরিয়ে দেয়।


তাহলে লিনক কেন ব্যবহার করবেন? এটি তালিকা এবং অ্যাডারেঞ্জ ব্যবহারের চেয়ে দ্রুত হবে?
থান্ডারগ্রি

1
আমি জানি না দ্রুত কী হবে এবং এটি একটি গুরুত্বপূর্ণ প্রশ্ন মনে করি না। আপনি যে কোনও জায়গাতেই এই সমস্যার সমাধানের জন্য কোডটি ব্যবহার করছেন, পারফরম্যান্সের পার্থক্য নগণ্য হবে be ভবিষ্যতে কোডটির রক্ষণাবেক্ষণযোগ্যতা সহজ করতে আরও পঠনযোগ্য কী তা প্রশ্ন করা উচিত। আমি মনে করি এটি একটি যুক্তিসঙ্গত উত্তর কারণ এটি একটি উত্স রেখায় রাখে, যা আমি মনে করি যে প্রশ্নটি ইচ্ছার একটি অংশ, কলগুলি প্রয়োজনীয় এবং স্পষ্টভাবে সেই লাইনের উদ্দেশ্যটি প্রকাশ করে। একই জিনিসটি সম্পাদন করতে একাধিক পদক্ষেপের সাথে তালিকাভুক্ত করা এবং অ্যাড্রেঞ্জ করা বিভ্রান্ত করছে।
ডেভ রায়েল

7

নাঃ। নিম্নলিখিত চেষ্টা করুন:

List<string> _searchPatternList = new List<string>();
    ...
    List<string> fileList = new List<string>();
    foreach ( string ext in _searchPatternList )
    {
        foreach ( string subFile in Directory.GetFiles( folderName, ext  )
        {
            fileList.Add( subFile );
        }
    }

    // Sort alpabetically
    fileList.Sort();

    // Add files to the file browser control    
    foreach ( string fileName in fileList )
    {
        ...;
    }

থেকে নেওয়া: http://blogs.msdn.com/markda/archive/2006/04/20/580075.aspx


7

দিন

var set = new HashSet<string> { ".mp3", ".jpg" };

তারপর

Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
         .Where(f => set.Contains(
             new FileInfo(f).Extension,
             StringComparer.OrdinalIgnoreCase));

অথবা

from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
from ext in set
where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase)
select file;

গেটফাইলে আপনার ওভারলোডের পোস্ট নেই।
নওফাল

5

আমি .Whereপদ্ধতিটি ব্যবহার করতে পারছি না কারণ আমি। নেট ফ্রেমওয়ার্ক 2.0 তে প্রোগ্রামিং করছি (লিনক কেবল নেট নেট ফ্রেমওয়ার্ক 3.5+ এ সমর্থিত)।

নীচের কোডটি কেস সংবেদনশীল নয় (তাই .CaBবা .cabখুব বেশি তালিকাভুক্ত করা হবে)।

string[] ext = new string[2] { "*.CAB", "*.MSU" };

foreach (string found in ext)
{
    string[] extracted = Directory.GetFiles("C:\\test", found, System.IO.SearchOption.AllDirectories);

    foreach (string file in extracted)
    {
        Console.WriteLine(file);
    }
}

4

নিম্নলিখিত ফাংশনটি কমা দ্বারা পৃথককৃত একাধিক নিদর্শনগুলিতে অনুসন্ধান করে। আপনি একটি বাদও নির্দিষ্ট করতে পারেন, যেমন: "! Web.config" সমস্ত ফাইল অনুসন্ধান করবে এবং "ওয়েবকনফিগ" বাদ দেবে " প্যাটার্নগুলি মিশ্রিত করা যেতে পারে।

private string[] FindFiles(string directory, string filters, SearchOption searchOption)
{
    if (!Directory.Exists(directory)) return new string[] { };

    var include = (from filter in filters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) where !string.IsNullOrEmpty(filter.Trim()) select filter.Trim());
    var exclude = (from filter in include where filter.Contains(@"!") select filter);

    include = include.Except(exclude);

    if (include.Count() == 0) include = new string[] { "*" };

    var rxfilters = from filter in exclude select string.Format("^{0}$", filter.Replace("!", "").Replace(".", @"\.").Replace("*", ".*").Replace("?", "."));
    Regex regex = new Regex(string.Join("|", rxfilters.ToArray()));

    List<Thread> workers = new List<Thread>();
    List<string> files = new List<string>();

    foreach (string filter in include)
    {
        Thread worker = new Thread(
            new ThreadStart(
                delegate
                {
                    string[] allfiles = Directory.GetFiles(directory, filter, searchOption);
                    if (exclude.Count() > 0)
                    {
                        lock (files)
                            files.AddRange(allfiles.Where(p => !regex.Match(p).Success));
                    }
                    else
                    {
                        lock (files)
                            files.AddRange(allfiles);
                    }
                }
            ));

        workers.Add(worker);

        worker.Start();
    }

    foreach (Thread worker in workers)
    {
        worker.Join();
    }

    return files.ToArray();

}

ব্যবহার:

foreach (string file in FindFiles(@"D:\628.2.11", @"!*.config, !*.js", SearchOption.AllDirectories))
            {
                Console.WriteLine(file);
            }

4
List<string> FileList = new List<string>();
DirectoryInfo di = new DirectoryInfo("C:\\DirName");

IEnumerable<FileInfo> fileList = di.GetFiles("*.*");

//Create the query
IEnumerable<FileInfo> fileQuery = from file in fileList
                                  where (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
                                  orderby file.LastWriteTime
                                  select file;

foreach (System.IO.FileInfo fi in fileQuery)
{
    fi.Attributes = FileAttributes.Normal;
    FileList.Add(fi.FullName);
}

file.Extension.ToLower()খারাপ অনুশীলন।
আবাটিশচেভ

তাহলে আমাদের কী ব্যবহার করা উচিত? @ বাতিশচেভ
নিতিন সাওয়ান্ত

@ নিতিন:String.Equals(a, b, StringComparison.OrdinalIgnoreCase)
আবাতিশ্চেভ

1
প্রকৃতপক্ষে, ফাইল.এক্সটেনশন.একুয়ালস ("। জেপিজি", স্ট্রিংকম্পিউশন.অর্ডিনালআইগনোর কেস) আমি পছন্দ করি। এটি .ToLower বা .ToUpper এর চেয়ে বেশি দ্রুত বলে মনে হচ্ছে বা তাই তারা যেখানেই বলেছে আমি অনুসন্ধান করেছি। আসলে, .কামগুলি == এর চেয়েও দ্রুত, যেহেতু == কলগুলি। নালগুলির জন্য মূল্য এবং চেকগুলি (কারণ আপনি শূন্য করতে পারবেন না qu কোয়াল (নাল))।
থান্ডারগ্রি

4

নেট .০.০ (কোনও লিঙ্ক নেই):

public static List<string> GetFilez(string path, System.IO.SearchOption opt,  params string[] patterns)
{
    List<string> filez = new List<string>();
    foreach (string pattern in patterns)
    {
        filez.AddRange(
            System.IO.Directory.GetFiles(path, pattern, opt)
        );
    }


    // filez.Sort(); // Optional
    return filez; // Optional: .ToArray()
}

তারপরে এটি ব্যবহার করুন:

foreach (string fn in GetFilez(path
                             , System.IO.SearchOption.AllDirectories
                             , "*.xml", "*.xml.rels", "*.rels"))
{}


3

এটি করার জন্য অন্য একটি উপায় খুঁজে পেয়েছি। এখনও একটি অপারেশন নয়, তবে অন্যান্য ব্যক্তিরা এটি সম্পর্কে কী ভাবছেন তা দেখতে এটি ছুঁড়ে ফেলা হচ্ছে।

private void getFiles(string path)
{
    foreach (string s in Array.FindAll(Directory.GetFiles(path, "*", SearchOption.AllDirectories), predicate_FileMatch))
    {
        Debug.Print(s);
    }
}

private bool predicate_FileMatch(string fileName)
{
    if (fileName.EndsWith(".mp3"))
        return true;
    if (fileName.EndsWith(".jpg"))
        return true;
    return false;
}

3

কি সম্পর্কে

string[] filesPNG = Directory.GetFiles(path, "*.png");
string[] filesJPG = Directory.GetFiles(path, "*.jpg");
string[] filesJPEG = Directory.GetFiles(path, "*.jpeg");

int totalArraySizeAll = filesPNG.Length + filesJPG.Length + filesJPEG.Length;
List<string> filesAll = new List<string>(totalArraySizeAll);
filesAll.AddRange(filesPNG);
filesAll.AddRange(filesJPG);
filesAll.AddRange(filesJPEG);

2

আপনি একটি স্ট্রিং যেমন ".mp3.jpg.wma.wmf" চান এক্সটেনশানগুলি তৈরি করুন এবং তারপরে প্রতিটি ফাইলটিতে আপনার পছন্দসই এক্সটেনশন রয়েছে কিনা তা পরীক্ষা করুন। এটি .NET 2.0 এর সাথে কাজ করে কারণ এটি লিনকিউ ব্যবহার করে না।

string myExtensions=".jpg.mp3";

string[] files=System.IO.Directory.GetFiles("C:\myfolder");

foreach(string file in files)
{
   if(myExtensions.ToLower().contains(System.IO.Path.GetExtension(s).ToLower()))
   {
      //this file has passed, do something with this file

   }
}

এই পদ্ধতির সাথে সুবিধাটি হ'ল আপনি কোডটি সম্পাদনা না করে এক্সটেনশনগুলি যুক্ত করতে বা মুছে ফেলতে পারেন অর্থাৎ পিএনজি চিত্রগুলি যুক্ত করতে, কেবল আমার এক্সটেনশনগুলি লিখুন = "। jpg.mp3.png"।


এটি কী তা জানে নাs
বন্ধকগুলি

2
/// <summary>
/// Returns the names of files in a specified directories that match the specified patterns using LINQ
/// </summary>
/// <param name="srcDirs">The directories to seach</param>
/// <param name="searchPatterns">the list of search patterns</param>
/// <param name="searchOption"></param>
/// <returns>The list of files that match the specified pattern</returns>
public static string[] GetFilesUsingLINQ(string[] srcDirs,
     string[] searchPatterns,
     SearchOption searchOption = SearchOption.AllDirectories)
{
    var r = from dir in srcDirs
            from searchPattern in searchPatterns
            from f in Directory.GetFiles(dir, searchPattern, searchOption)
            select f;

    return r.ToArray();
}

2

নাহ ... আমি বিশ্বাস করি যে ফাইল ফাইলগুলি আপনি চান সেগুলি করতে হবে।

আমি আমার নিজের প্রয়োজনীয় এক্সটেনশনগুলির সাথে স্ট্রিংগুলিতে একটি অ্যারে নিয়ে নিজে একটি ফাংশন তৈরি করব এবং তারপরে সমস্ত প্রয়োজনীয় কল করে সেই অ্যারেটিতে পুনরাবৃত্তি করব। এই ফাংশনটি আমার পাঠানো এক্সটেনশনের সাথে মিলে যাওয়া ফাইলগুলির একটি জেনেরিক তালিকা ফিরে আসবে।

আশা করি এটা সাহায্য করবে.


1

আমারও একই সমস্যা ছিল এবং সঠিক সমাধানটি খুঁজে পেলাম না তাই আমি getFiles নামে একটি ফাংশন লিখেছিলাম:

/// <summary>
/// Get all files with a specific extension
/// </summary>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>array of all the files with the specific extensions</returns>
public string[] GetFiles(List<string> extensionsToCompare, string Location)
{
    List<string> files = new List<string>();
    foreach (string file in Directory.GetFiles(Location))
    {
        if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.')+1).ToLower())) files.Add(file);
    }
    files.Sort();
    return files.ToArray();
}

এই ফাংশনটি Directory.Getfiles()শুধুমাত্র একবারে কল করবে ।

উদাহরণস্বরূপ ফাংশনটি কল করুন:

string[] images = GetFiles(new List<string>{"jpg", "png", "gif"}, "imageFolder");

সম্পাদনা: একাধিক এক্সটেনশান সহ একটি ফাইল পেতে এটি ব্যবহার করুন:

/// <summary>
    /// Get the file with a specific name and extension
    /// </summary>
    /// <param name="filename">the name of the file to find</param>
    /// <param name="extensionsToCompare">string list of all the extensions</param>
    /// <param name="Location">string of the location</param>
    /// <returns>file with the requested filename</returns>
    public string GetFile( string filename, List<string> extensionsToCompare, string Location)
    {
        foreach (string file in Directory.GetFiles(Location))
        {
            if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.') + 1).ToLower()) &&& file.Substring(Location.Length + 1, (file.IndexOf('.') - (Location.Length + 1))).ToLower() == filename) 
                return file;
        }
        return "";
    }

উদাহরণস্বরূপ ফাংশনটি কল করুন:

string image = GetFile("imagename", new List<string>{"jpg", "png", "gif"}, "imageFolder");

1

আমি ভাবছি কেন এতগুলি "সমাধান" পোস্ট করা আছে?

গেটফাইলস কীভাবে কাজ করে সে সম্পর্কে যদি আমার ছদ্মবেশী বোঝাপড়া সঠিক হয়, তবে কেবল দুটি বিকল্প রয়েছে এবং উপরের যে কোনও সমাধানের এগুলিকে নামিয়ে আনা যেতে পারে:

  1. গেটফাইস, তারপরে ফিল্টার করুন: দ্রুত, তবে ওভারহেড স্টোর করার কারণে একটি মেমরি কিলার ফিল্টার প্রয়োগ করা হয়

  2. গেটফাইলে থাকাকালীন ফিল্টার করুন: আরও ফিল্টার সেট করা ধীরে ধীরে কম থাকলেও ওভারহেড সংরক্ষণ না হওয়ায় কম মেমরির ব্যবহার হয়।
    এটি একটি চিত্তাকর্ষক বেঞ্চমার্ক সহ উপরের পোস্টগুলির মধ্যে একটিতে ব্যাখ্যা করা হয়েছে: প্রতিটি ফিল্টার বিকল্প একটি পৃথক গেটফিল-অপারেশন ঘটায় তাই হার্ডড্রাইভের একই অংশটি বেশ কয়েকবার পড়ে।

আমার মতে বিকল্প 1) ভাল তবে সি: like এর মতো ফোল্ডারে সার্চ অপশন.অলডাইরেক্টরিগুলি ব্যবহার করা বিপুল পরিমাণে মেমরি ব্যবহার করবে।
এর জন্য আমি কেবল একটি পুনরাবৃত্ত উপ-পদ্ধতি তৈরি করব যা বিকল্প 1 ব্যবহার করে সমস্ত সাবফোল্ডারগুলিতে যায়)

এটি প্রতিটি ফোল্ডারে কেবলমাত্র 1 গেটফিলস-অপারেশন ঘটায় এবং তার জন্য দ্রুত (বিকল্প 1) হওয়া উচিত, তবে প্রতিটি সাবফোল্ডারগুলির পড়ার পরে ফিল্টারগুলি প্রয়োগ করা হয় -> প্রতিটি সাবফোল্ডার পরে ওভারহেড মুছে ফেলা হয়।

আমি ভুল হলে আমাকে সংশোধন করুন। আমি যেমন প্রোগ্রামিংয়ে বেশ নতুন বলেছি তবে অবশেষে ভাল হওয়ার জন্য বিষয়গুলির গভীর উপলব্ধি অর্জন করতে চাই :)


1

আপনি যদি ভিবি.এনইটি ব্যবহার করছেন (বা আপনার সি # প্রকল্পের উপর নির্ভরতা আমদানি করেছেন), আসলে একটি সুবিধা পদ্ধতি রয়েছে যা একাধিক এক্সটেনশনের জন্য ফিল্টার করতে দেয়:

Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});

VB.NET এ মাই-নেমস্পেসের মাধ্যমে অ্যাক্সেস করা যায়:

My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})

দুর্ভাগ্যক্রমে, এই সুবিধাগুলি পদ্ধতিগুলি যেমন অলসভাবে মূল্যায়ন করা বৈকল্পিক সমর্থন Directory.EnumerateFiles()করে না।


এটি সহজেই সেরা উত্তর এবং তবুও আরও কিছু হ্যাকি গ্রহণযোগ্য একটি accepted ভালো লাগছে তাই।
রবি কোয়েন

0

আমি বুঝতে পারি না কোন সমাধানটি আরও ভাল তবে আমি এটি ব্যবহার করি:

String[] ext = "*.ext1|*.ext2".Split('|');

            List<String> files = new List<String>();
            foreach (String tmp in ext)
            {
                files.AddRange(Directory.GetFiles(dir, tmp, SearchOption.AllDirectories));
            }

0

ফিল্টার করা ফাইলগুলি পাওয়ার জন্য এখানে একটি সহজ এবং মার্জিত উপায়

var allowedFileExtensions = ".csv,.txt";


var files = Directory.EnumerateFiles(@"C:\MyFolder", "*.*", SearchOption.TopDirectoryOnly)
                .Where(s => allowedFileExtensions.IndexOf(Path.GetExtension(s)) > -1).ToArray(); 

-1

অথবা আপনি কেবল এক্সটেনশনের স্ট্রিংটিকে স্ট্রিং to এ রূপান্তর করতে পারেন ^

vector <string>  extensions = { "*.mp4", "*.avi", "*.flv" };
for (int i = 0; i < extensions.size(); ++i)
{
     String^ ext = gcnew String(extensions[i].c_str());;
     String^ path = "C:\\Users\\Eric\\Videos";
     array<String^>^files = Directory::GetFiles(path,ext);
     Console::WriteLine(ext);
     cout << " " << (files->Length) << endl;
}

2
এটি সি ++ সি নয়
বন্ধকগুলি

-1

এক্সটেনশানটি ফিল্টার করার জন্য গেটফাইস অনুসন্ধানের প্যাটার্ন ব্যবহার করা নিরাপদ নয় !! উদাহরণস্বরূপ আপনার কাছে দুটি টেস্ট.এক্সএলএস এবং টেস্ট 2.xlsx ফাইল রয়েছে এবং আপনি অনুসন্ধান প্যাটার্ন * .xls ব্যবহার করে এক্সএলএস ফাইল ফিল্টার করতে চান, তবে গেটফিলস টেস্ট 1.xls এবং টেস্ট 2.xlsx উভয়ইই ফিরিয়ে আনতে পেরেছি এবং আমি উত্পাদনে ত্রুটি পেয়েছি got পরিবেশ যখন কিছু অস্থায়ী ফাইল হঠাৎ সঠিক ফাইল হিসাবে পরিচালিত হয়। অনুসন্ধানের প্যাটার্নটি ছিল * .txt এবং অস্থায়ী ফাইলগুলির নাম দেওয়া হয়েছিল * .txt20181028_100753898 সুতরাং অনুসন্ধানের প্যাটার্নটি বিশ্বাস করা যায় না, আপনাকে ফাইলের নামগুলিতেও অতিরিক্ত চেক যোগ করতে হবে।


প্রশ্নের উত্তর দেয় না।
রবি কোয়েন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.