2008-09-09 18 views
58

System.IO.Directory.GetFiles()string[] देता है। लौटाए गए मूल्यों के लिए डिफ़ॉल्ट क्रम क्रम क्या है? मैं नाम से मान रहा हूं, लेकिन यदि ऐसा है तो वर्तमान संस्कृति इसका कितना प्रभाव डालती है? क्या आप इसे सृजन तिथि की तरह बदल सकते हैं?सॉर्टिंग निर्देशिका। गेटफाइल()

अद्यतन: MSDN बताते हैं कि सॉर्ट क्रम नेट 3.5 के लिए गारंटी नहीं है, लेकिन पेज के 2.0 संस्करण सब पर कुछ नहीं कहा और न ही पेज निर्माण या संशोधन जैसी चीजों के आधार पर चुनना तुम्हारी मदद करेगा पहर। आपके पास सरणी होने के बाद वह जानकारी खो जाती है (इसमें केवल स्ट्रिंग होती है)। मैं एक तुलनाकर्ता बना सकता हूं जो प्रत्येक फ़ाइल के लिए जांच करेगा, लेकिन इसका मतलब है कि फ़ाइल सिस्टम को बार-बार एक्सेस करना जब GetFiles() विधि पहले से ही ऐसा करती है। बहुत अक्षम लगता है।

उत्तर

103

आप इस तरह के CreationTime के रूप में फाइल के गुणों में रुचि रखते हैं, तो यह System.IO.DirectoryInfo.GetFileSystemInfos उपयोग करने के लिए और अधिक समझ बनाने के हैं()। फिर आप इन एक System.Linq में विस्तार तरीकों में से का उपयोग कर, उदा, सॉर्ट कर सकते हैं, .:

DirectoryInfo di = new DirectoryInfo("C:\\"); 
FileSystemInfo[] files = di.GetFileSystemInfos(); 
var orderedFiles = files.OrderBy(f => f.CreationTime); 

संपादित करें - माफ करना, मैं नोटिस नहीं किया था .NET2.0 टैग तो LINQ छंटाई ध्यान न दें। System.IO.DirectoryInfo.GetFileSystemInfos() का उपयोग करने के लिए सुझाव अभी भी है।

+0

.NET2.0 में कोई LINQ नहीं है, लेकिन अब तक का सबसे अच्छा जवाब है। –

+0

मुझे जवाब को अस्वीकार करना पड़ा, क्योंकि जब मैं इसे लागू करने के लिए आज वापस गया था। नेट 2.0 विधि को .GetFileSystemEntries कहा जाता है, और _it अभी भी केवल एक स्ट्रिंग सरणी देता है ._ –

+3

जोएल, आप गलत ऑब्जेक्ट को देख रहे हैं। System.IO.Directory में GetFileSystemEntries विधि है। मेरा सुझाव है कि इसके बजाय System.IO.DirectoryInfo का उपयोग करें, जिसमें GetFileSystemInfos विधि है। उम्मीद है कि यह मदद करता है। –

7

Dim Files() As String 
Files = System.IO.Directory.GetFiles("C:\") 
Array.Sort(Files) 
5

msdn से:

लौटे फ़ाइल नाम इसकी गारंटी नहीं है के आदेश; एक विशिष्ट सॉर्ट ऑर्डर की आवश्यकता होने पर सॉर्ट() विधि का उपयोग करें।

Sort() विधि यदि आप प्रकार निर्माण तिथि के द्वारा, यह स्थानीयकरण मशीन सेटिंग के आधार पर संभाल लेंगे मानक Array.Sort() है, जो (अन्य भार के अलावा) IComparables में लेता है, इसलिए।

2

MSDN Documentation बताता है कि वापसी मूल्यों पर किसी भी आदेश की कोई गारंटी नहीं है। आपको सॉर्ट() विधि का उपयोग करना होगा।

2

आप सही हैं, डिफ़ॉल्ट मेरा नाम asc है। फ़ाइलइन्फो संग्रह से डेटाटेबल बनाने के लिए इसे सॉर्ट ऑर्डर बदलने का एकमात्र तरीका है।

फिर आप डेटाटेबल से डिफॉल्ट व्यू का उपयोग कर सकते हैं और निर्देशिका को सॉर्ट विधि से सॉर्ट कर सकते हैं।

यह काफी शामिल है और काफी धीमा है लेकिन मुझे उम्मीद है कि कोई बेहतर समाधान पोस्ट करेगा।

+3

डिफ़ॉल्ट आदेश फाइल सिस्टम उन्हें में देता है। आप NTFS का उपयोग कर रहे हैं, वे अल्फा हल हो जाएगा, लेकिन अगर आप एफएटी 32 का उपयोग कर रहे हैं, वे टेबल ऑर्डर में लौटाए जाएंगे (यानी, सृजन के कम या कम क्रम)। –

2

आप सृजन तिथि द्वारा क्रमबद्ध करने के लिए एक कस्टम आईसीओएमपेयर इंटरफ़ेस लिख सकते हैं, और फिर उसे Array.Sort पर भेज सकते हैं। आप शायद StrCmpLogical को भी देखना चाहते हैं, जो सॉर्टिंग एक्सप्लोरर का उपयोग करने के लिए उपयोग किया जाता है (टेक्स्ट के साथ सही ढंग से क्रमबद्ध संख्या)।

2

यदि आप सृजन तिथि की तरह कुछ सॉर्ट करना चाहते हैं तो आपको शायद DirectoryInfo.GetFiles का उपयोग करने की आवश्यकता है और उसके बाद परिणामस्वरूप सरणी को उचित भविष्य का उपयोग करके सॉर्ट करना होगा।

3

आप सॉर्टिंग करने के लिए कस्टम iComparer को कार्यान्वित कर सकते हैं। फ़ाइलों के लिए फ़ाइल जानकारी पढ़ें और अपनी पसंद के अनुसार तुलना करें।

IComparer comparer = new YourCustomComparer(); 
Array.Sort(System.IO.Directory.GetFiles(), comparer); 

msdn info IComparer interface

12

यहां वीबी.Net समाधान है जिसका मैंने उपयोग किया है।

Private Class DateComparer 
    Implements System.Collections.IComparer 

    Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare 
     Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo) 
     Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo) 

     Dim Date1 As DateTime = FileInfo1.CreationTime 
     Dim Date2 As DateTime = FileInfo2.CreationTime 

     If Date1 > Date2 Then Return 1 
     If Date1 < Date2 Then Return -1 
     Return 0 
    End Function 
End Class 

तब जबकि सरणी छँटाई comparer का उपयोग करें::

पहले दिनांक तुलना करने के लिए एक वर्ग बनाने

Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\") 
Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles() 
Dim comparer As IComparer = New DateComparer() 
Array.Sort(Files, comparer) 
+1

में उपलब्ध नहीं था में से एक को लागू करने की है मैं क्योंकि सरणी नमूना कोड संपादित कर लिया है .Sort DateComparer का एक उदाहरण की जरूरत है, या हम एक "DateComparer एक प्रकार है और अभिव्यक्ति के रूप में नहीं किया जा सकता" त्रुटि मिलती है। कोड के लिए धन्यवाद क्योंकि यह लगभग उपयोग करने के लिए तैयार था। – AlfonsoML

12

.NET 2.0 में, आप करने के लिए Array.Sort का उपयोग करना होगा FileSystemInfos को सॉर्ट करें।

साथ ही, आपको सिर्फ तुलना के लिए एक वर्ग की घोषणा करने से बचने के लिए एक comparer प्रतिनिधि उपयोग कर सकते हैं:

DirectoryInfo dir = new DirectoryInfo(path); 
FileSystemInfo[] files = dir.GetFileSystemInfos(); 

// sort them by creation time 
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b) 
            { 
             return a.LastWriteTime.CompareTo(b.LastWriteTime); 
            }); 
+1

अरे क्रिस, कोड में टिप्पणी गलत है? आप सृजन के समय से राज्य की तरह बताते हैं, लेकिन LastWriteTime का निर्माण CreationTime नहीं है? बस एहसास हुआ कि चेहरे के बाद यह टिप्पणी कैसे है! – AidanO

1

बस एक विचार। मुझे एक आसान तरीका मिलना पसंद है और पहले से ही उपलब्ध संसाधनों का उपयोग करने का प्रयास करें। अगर मैं फाइलों को सॉर्ट करना चाहता था तो मैं सिर्फ एक प्रक्रिया बनाउंगा और "डीआईआर [एक्स: \ फ़ोल्डर्स \ सबफोल्डर *। *]/एस/बी/ऑन" को सिस्कल बनाउंगा और आउटपुट कैप्चर करूँगा।

सिस्टम के DIR के साथ आदेश के द्वारा आप क्रमबद्ध कर सकते हैं:

/O   List by files in sorted order. 
sortorder N By name (alphabetic)  S By size (smallest first) 
      E By extension (alphabetic) D By date/time (oldest first) 
      G Group directories first - Prefix to reverse order 

The /S switch includes sub folders 

मैं अगर डी = करके दिनांक/समय LastModifiedDate या FileCreateDate उपयोग कर रहा है यकीन नहीं है। लेकिन यदि डीआईआर कमांड में आवश्यक सॉर्ट ऑर्डर पहले से ही अंतर्निहित है, तो मुझे सिस्कल को कॉल करके मिल जाएगा। और यह तेज़ है। मैं सिर्फ आलसी पुरुष हूं;)

एक छोटे से Googling मैं स्विच पाया विशेष तिथि/समय से सॉर्ट करने के बाद: -

/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. 

Value Description 
c : Creation 
a : Last access 
w : Last written 
1

एक और अधिक संक्षिप्त VB.Net संस्करण, किसी को दिलचस्पी है अगर

Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _ 
    New DirectoryInfo("c:\temp").GetFiles() _ 
    .OrderBy(Function(f As FileInfo) f.CreationTime) 
For Each fi As IO.FileInfo In filePaths 
    ' Do whatever you wish here 
Next 
3

एक अधिक संक्षिप्त VB.Net संस्करण ... बहुत अच्छा है। धन्यवाद। उलटे क्रम में सूची पार करने के लिए, रिवर्स विधि जोड़ने ...

For Each fi As IO.FileInfo In filePaths.reverse 
    ' Do whatever you wish here 
Next 
संबंधित मुद्दे