طريقة سريعة لتعداد جميع الملفات بما في ذلك المرحلين الفرعيين

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

سؤال

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

Public Shared allFiles() As String
allFiles = Directory.GetFiles(<ServerLocation>, "*.*", SearchOption.AllDirectories)

شكرًا! JFV

تحرير: أنا أعدد هذه الملفات من موقع الخادم. لا أعرف ما إذا كان ذلك سيغير منظور هذا السؤال أم لا. شكرا لجميع المدخلات حتى الآن!

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

المحلول

اجابة قصيرة:

إذا كان هذا الرمز صحيحًا وظيفيًا لمشروعك ولم تثبت أنه يمثل مشكلة مع Pfinder ، فلا تقوم بتغييره. استمر في استخدام الحل الصحيح وظيفيًا حتى تثبت أنه بطيء.

اجابة طويلة:

ما مدى سرعة أو إبطاء هذه الرمز المعين يعتمد على أ كثير من العوامل. يعتمد العديد منها على الجهاز المحدد الذي تقوم بتشغيله (على سبيل المثال سرعة محرك الأقراص الثابتة). بالنظر إلى الكود الذي يتضمن نظام الملفات ولا شيء آخر ، من الصعب جدًا القول "X أسرع من Y" مع أي درجة من اليقين.

في هذه الحالة ، لا يمكنني التعليق إلا على شيء واحد. نوع الإرجاع لهذه الطريقة هو مجموعة من قيم FileInfo. تتطلب المصفوفات ذاكرة متجاورة ويمكن أن تسبب المصفوفات الكبيرة جدًا مشكلات تجزئة في كومةك. اذا كنت تمتلك الى ابعد حد الدلائل الكبيرة التي تقرأها قد تؤدي إلى تجزئة الكومة وقضايا الأداء بشكل غير مباشر.

إذا تبين أن هذا يمثل مشكلة ، فيمكنك أن تدخل في FindFirstFile / FindNextFile والحصول عليها واحدة تلو الأخرى. من المحتمل أن تكون النتيجة أبطأ وظيفيًا في دورات وحدة المعالجة المركزية ولكن سيكون لها ضغط ذاكرة أقل.

لكن يجب أن أؤكد أنه يجب عليك إثبات أن هذه مشاكل أمامك يصلح هم.

نصائح أخرى

باستخدام system.collections.generic ؛

private static List<string> GetFilesRecursive(string b)
{

             // 1.
            // Store results in the file results list.
            List<string> result = new List<string>();

            // 2.
            // Store a stack of our directories.
            Stack<string> stack = new Stack<string>();

            // 3.
            // Add initial directory.
            stack.Push(b);

            // 4.
            // Continue while there are directories to process
            while (stack.Count > 0)
            {
                // A.
                // Get top directory
                string dir = stack.Pop();

                try
                {
                    // B
                    // Add all files at this directory to the result List.
                    result.AddRange(Directory.GetFiles(dir, "*.*"));

                    // C
                    // Add all directories at this directory.
                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch
                {
                    // D
                    // Could not open the directory
                }
            }
            return result;
        }

الدعائم إلى المقالة الأصلية: http://www.codeproject.com/kb/cs/workerthread.aspx

هذه طريقة خام للقيام بذلك.

dir /s /b

احصل على إخراج هذا في ملف نصي ، وقراءته وتقسيمه \r\n.
قم بتشغيل الأمر أعلاه في دليل معين ، لمعرفة ما إذا كان يساعد.

للحصول على الدلائل فقط

dir /s /b /ad

للحصول على الملفات فقط

dir /s /b /a-d

تحرير: جاريد محق في قول عدم استخدام أساليب أخرى ما لم يثبت منهجك بطيئًا.

هيرس حلي. البداية الأولية بطيئة بعض الشيء ، أنا أعمل على ذلك. كائن my.computer.filesystem هو مشكلة بدء التشغيل البطيء. لكن هذه الطريقة ستسرد 31000 ملف في أقل من 5 دقائق عبر الشبكة.

Imports System.Threading

Public Class ThreadWork

Public Shared Sub DoWork()
    Dim i As Integer = 1
    For Each File As String In My.Computer.FileSystem.GetFiles("\\172.16.1.66\usr2\syscon\S4_650\production\base_prog", FileIO.SearchOption.SearchTopLevelOnly, "*.S4")
        Console.WriteLine(i & ". " & File)
        i += 1
    Next
End Sub 'DoWork
End Class 'ThreadWork

Module Module1

Sub Main()
    Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
    Dim myThread As New Thread(myThreadDelegate)
    myThread.Start()
    '"Pause" the console to read the data.
    Console.ReadLine()
End Sub 'Main

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