العثور على عدد من الملفات مع تمديد مدة محددة ، في كافة الدلائل الفرعية

StackOverflow https://stackoverflow.com/questions/27570

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك طريقة للعثور على عدد من الملفات من نوع معين من دون الحاجة إلى حلقة من خلال كل النتائج inn دليل.GetFiles() أو ما شابه الطريقة ؟ أنا أبحث عن شيء مثل هذا:

int ComponentCount = MagicFindFileCount(@"c:\windows\system32", "*.dll");

وأنا أعلم أنني يمكن أن تجعل وظيفة متكررة للاتصال الدليل.GetFiles ، ولكن سيكون أنظف بكثير إذا كنت يمكن أن تفعل هذا من دون كل بالتكرار.

تحرير: إذا كان من غير الممكن القيام بذلك من دون recursing و بالتكرار نفسك, ما يمكن أن يكون أفضل طريقة للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

يجب عليك استخدام الدليل.GetFiles(المسار ، searchPattern, SearchOption) الزائد من الدليل.GetFiles().

المسار تحديد, searchPattern تحدد الخاص بك البدل (على سبيل المثال, *, *.شكل) و SearchOption يوفر خيار تشمل الدلائل.

طول المنشأة عودة مجموعة من هذا البحث سوف نقدم المناسبة عدد الملفات الخاصة بك نمط البحث و الخيار:

string[] files = directory.GetFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories);

return files.Length;

تحرير: بدلا من ذلك يمكنك استخدام الدليل.EnumerateFiles طريقة

return Directory.EnumerateFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories).Count();

نصائح أخرى

سليكست طريقة وود استخدام linq:

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                    select file).Count();

يمكنك استخدام هذا الحمل الزائد من GetFiles:

الدليل.الأسلوب GetFiles (سلسلة ، سلسلة SearchOption)

و هذا العضو من SearchOption:

AllDirectories - يتضمن الحالي الدليل و كل الدلائل في عملية البحث.هذا الخيار يتضمن نقاط إعادة التوزيع مثل شنت محركات وصلات رمزية في البحث.

GetFiles بإرجاع صفيف السلسلة حتى تتمكن من مجرد الحصول على طول وهو عدد الملفات التي تم العثور عليها.

كنت ابحث عن المزيد من الإصدار الأمثل.وحيث لم أجد ذلك ، قررت رمز وتقاسمها هنا:

    public static int GetFileCount(string path, string searchPattern, SearchOption searchOption)
    {
        var fileCount = 0;
        var fileIter = Directory.EnumerateFiles(path, searchPattern, searchOption);
        foreach (var file in fileIter)
            fileCount++;
        return fileCount;
    }

كل الحلول باستخدام GetFiles/GetDirectories هي بطيئة نوعا ما لأن كل هذه الأشياء تحتاج إلى إنشاء.باستخدام تعداد أنه لا يخلق أي الكائنات المؤقتة (FileInfo/DirectoryInfo).

انظر الملاحظات http://msdn.microsoft.com/en-us/library/dd383571.aspx للحصول على مزيد من المعلومات

استخدام العودية الخاص بك MagicFindFileCount تبدو مثل هذا:

private int MagicFindFileCount( string strDirectory, string strFilter ) {
     int nFiles = Directory.GetFiles( strDirectory, strFilter ).Length;

     foreach( String dir in Directory.GetDirectories( strDirectory ) ) {
        nFiles += GetNumberOfFiles(dir, strFilter);
     }

     return nFiles;
  }

على الرغم من جون الحل قد يكون أفضل واحد.

لدي التطبيق الذي يولد التهم من الدلائل و الملفات في الدليل الأصل.بعض الدلائل التي تحتوي على الآلاف من الدلائل الفرعية مع الآلاف من الملفات في كل منهما.للقيام بذلك مع الحفاظ على استجابة واجهة المستخدم أفعل التالية ( إرسال الطريق إلى ADirectoryPathWasSelected الطريقة):

public class DirectoryFileCounter
{
    int mDirectoriesToRead = 0;

    // Pass this method the parent directory path
    public void ADirectoryPathWasSelected(string path)
    {
        // create a task to do this in the background for responsive ui
        // state is the path
        Task.Factory.StartNew((state) =>
        {
            try
            {
                // Get the first layer of sub directories
                this.AddCountFilesAndFolders(state.ToString())


             }
             catch // Add Handlers for exceptions
             {}
        }, path));
    }

    // This method is called recursively
    private void AddCountFilesAndFolders(string path)
    {
        try
        {
            // Only doing the top directory to prevent an exception from stopping the entire recursion
            var directories = Directory.EnumerateDirectories(path, "*.*", SearchOption.TopDirectoryOnly);

            // calling class is tracking the count of directories
            this.mDirectoriesToRead += directories.Count();

            // get the child directories
            // this uses an extension method to the IEnumerable<V> interface,
           // which will run a function on an object. In this case 'd' is the 
           // collection of directories
            directories.ActionOnEnumerable(d => AddCountFilesAndFolders(d));
        }
        catch // Add Handlers for exceptions
        {
        }
        try
        {
            // count the files in the directory
            this.mFilesToRead += Directory.EnumerateFiles(path).Count();
        }
        catch// Add Handlers for exceptions
        { }
    }
}
// Extension class
public static class Extensions
{ 
    // this runs the supplied method on each object in the supplied enumerable
    public static void ActionOnEnumerable<V>(this IEnumerable<V> nodes,Action<V> doit)
    {

        foreach (var node in nodes)
        {   
            doit(node);
        }
    }
}

شخص ما لديه للقيام بالتكرار جزء.

AFAIK, لا يوجد مثل هذه الطريقة موجودة في .صافي بالفعل, لذا أعتقد أن شخص ما يجب أن يكون لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top