2011-03-10 14 views
6

एक सरल उदाहरण के रूप में मैं निम्नलिखितसी # एन्युमेरेटफाइल वाइल्डकार्ड गैर मैचों को वापस कर रहा है?

IEnumerable<string> files = Directory.EnumerateFiles(path, @"2010*.xml", 
    SearchOption.TopDirectoryOnly).ToList(); 

मेरे परिणामों में क्रियान्वित कर रहा हूँ सेट मैं जो कोई मुकाबला नहीं फ़ाइल पैटर्न कर कुछ फ़ाइलें हो रही है। Msdn खोज के अनुसार पैटर्न वाइल्डकार्ड "शून्य या अधिक वर्ण" है और एक पूर्व पूर्व नहीं है। एक उदाहरण यह है कि मुझे फ़ाइल नाम वापस "2004_someothername.xml" मिल रहा है।

जानकारी के लिए फ़ोल्डर में 25,000 से अधिक फ़ाइलें हैं।

क्या किसी को पता है कि क्या हो रहा है?

+1

क्या आप उन फाइलनामों के कुछ उदाहरण पोस्ट कर सकते हैं जो मेल नहीं कर रहे हैं? – cptScarlet

+0

आप "सरलीकृत उदाहरण के रूप में" कहते हैं - क्या आपने परीक्षण किया है कि आपके द्वारा दिखाए गए कोड वास्तव में आपके द्वारा दावा की गई फ़ाइल को वापस कर देंगे? यह अधिक संभावना है कि समस्या गैर-सरलीकृत उदाहरण में हुई है ...! –

+0

उदाहरण आपने प्रदान किया है ठीक काम करता है। बस इसका परीक्षण किया। तो अगर आप वास्तविक कोड पोस्ट कर सकते हैं जो ठीक से काम नहीं कर रहा है – Stecya

उत्तर

8

यह विंडोज़ वाइल्डकार्ड मिलान करने के तरीके के कारण है - इसमें इसके वाइल्डकार्ड खोज में एन्कोडेड 8.3 फ़ाइल नाम शामिल हैं, जिसके परिणामस्वरूप कुछ आश्चर्यजनक मिलान हुए हैं!

इस बग के चारों ओर जाने का एक तरीका है ओएस वाइल्डकार्ड मैच के माध्यम से वापस आने वाले सभी फ़ाइल परिणामों को रीस्टेट करना और वाइल्डकार्ड की मैन्युअल तुलना प्रत्येक (लंबी) फ़ाइल नाम से परीक्षण करना है। एक और तरीका turn off 8.3 filenames altogether via the registry है। मुझे कई अवसरों पर जला दिया गया है, जिसमें कमांड प्रॉम्प्ट से वाइल्डकार्ड आधारित डेल कमांड के माध्यम से महत्वपूर्ण (गैर-मिलान) फ़ाइलों को हटाया जा सकता है।

संक्षेप में, बहुत सावधान हो, खासकर यदि आप किसी भी महत्वपूर्ण उत्पादन निर्णय लेने या एक OS फ़ाइल/वाइल्डकार्ड मैच के आधार पर किसी भी कार्रवाई करने पर एक निर्देशिका में कई फाइलों है, परिणामों के एक माध्यमिक सत्यापन के बिना।

यहां इस विचित्र व्यवहार का explanation है।

O'Reilly's site से एक और स्पष्टीकरण।

+2

बग रिपोर्ट से लिंक करने के लिए देखभाल? –

+3

क्या आपके पास उस बग का संदर्भ है? मैं Power.ll में 50,000 फ़ाइलों के साथ, system.IO.Directory कक्षा का उपयोग कर इसे फिर से बनाने में असमर्थ हूं। –

+0

@ सभी, इसके कारण पर और शोध करने के बाद, मैंने समस्या और संदर्भों के स्पष्टीकरण के साथ अपना उत्तर अपडेट किया। –

1

एमएस बग के लिए कोई समाधान नहीं है (जो संभवतः नीचे विंडोज फ़ाइल खोज का उपयोग करता है, जो आपके परिणामों के लिए भयानक होगा ...), लेकिन एक समाधान के रूप में एक समाधान, जो आपको परिणामों पर कुछ अतिरिक्त लाभ और नियंत्रण देता है :

var files = from file in 
     Directory.EnumerateFiles(path, "*", 
     SearchOption.TopDirectoryOnly) 
     where (new FileInfo(file)).Name.StartsWith("2010") && 
      (new FileInfo(file)).Extension == "xml" 
     select dir; 
1

मैं सिर्फ अपने उदाहरण की कोशिश की है और मैं इसे कुछ भी गलत कर नहीं देख सकते हैं, तो मैं वहाँ अपने वातावरण और/या "गैर सरलीकृत" कोड है जो यहां शामिल नहीं किया गया है करने के लिए अधिक है लगता है।

मैं इस कोड का उपयोग किया है:

Console.WriteLine("Starting..."); 
IEnumerable<string> files = Directory.EnumerateFiles("C:\\temp\\test\\2010", @"2010*.xml", SearchOption.TopDirectoryOnly).ToList(); 

foreach (string file in files) 
{ 
    Console.WriteLine("Found[{0}]", file); 
} 

Console.ReadLine(); 

मेरी फ़ोल्डर संरचना में मैं है निम्नलिखित बनाया:

c: \ अस्थायी \ परीक्षण \ 2010 \ 2004_something.xml c: \ अस्थायी \ test \ 2010 \ 2010_abc.xml c: \ अस्थायी \ परीक्षण \ 2010 \ 2010_def.xml

आवेदन के उत्पादन में बस है:

Starting... 
Found[C:\temp\test\2010\2010_abc.xml] 
Found[C:\temp\test\2010\2010_def.xml] 

क्या आप वास्तविक परिदृश्य में अपने परिदृश्य में क्या हो रहा है, इसके बारे में कुछ और प्रतिक्रिया दे सकते हैं? या आप समस्या को एक छोटे ऐप में पुन: उत्पन्न कर सकते हैं?

2

मैं आपकी समस्या को अनुवर्ती कोड (क्षमा करें, वीबी) के साथ पुन: उत्पन्न कर सकता हूं। यह नामित 55,000 शून्य-बाइट फ़ाइलों को 2010_5000.xml के माध्यम से बनाता है। फिर यह 2010 के साथ शुरू होने वाली सभी फाइलों की तलाश करता है।मेरी मशीन पर (विंडोज 7 एसपी 1 32-बिट) यह सिर्फ 5000 की बजाय 5,174 फाइलें देता है।

Option Explicit On 
Option Strict On 

Imports System.IO 

Public Class Form1 

    Private TempFolder As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Temp") 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     CreateFiles() 

     Dim Files = Directory.EnumerateFiles(TempFolder, "2010*.xml", SearchOption.TopDirectoryOnly).ToList() 
     Using FS As New FileStream(Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Report.txt"), FileMode.Create, FileAccess.Write, FileShare.Read) 
      Using SW As New StreamWriter(FS, System.Text.Encoding.ASCII) 
       For Each F In Files 
        SW.WriteLine(F) 
       Next 
      End Using 
     End Using 


     DeleteFiles() 
    End Sub 

    Private Sub CreateFiles() 
     If Not Directory.Exists(TempFolder) Then Directory.CreateDirectory(TempFolder) 
     Dim Bytes() As Byte = {} 
     Dim Name As String 
     For Y = 2000 To 2010 
      Trace.WriteLine(Y) 
      For I = 1 To 5000 
       Name = String.Format("{0}_{1}.xml", Y, I.ToString.PadLeft(4, "0"c)) 
       File.WriteAllBytes(Path.Combine(TempFolder, Name), Bytes) 
      Next 
     Next 
    End Sub 
    Private Sub DeleteFiles() 
     Directory.Delete(TempFolder, True) 
    End Sub 
End Class 
+1

भले ही यह वीबी है, बड़े प्रयास के लिए +1! :) –

+2

मुझे लगता है कि सभी सी # लोग सी # के साथ वीबी सवालों के जवाब देते हैं, मैं विपरीत करूँगा! असल में, यह वही है जो मैंने इस समय खोला था। –

0

एक ही समस्या का सामना करना पड़ा है, और इस पोस्ट मैंने सोचा था कि मैं अपने समाधान पोस्ट होगा खोजने:

IEnumerable<string> Files = Directory.EnumerateFiles(e.FileName, "*.xml").Where(File => File.EndsWith(".xml", StringComparison.InvariantCultureIgnoreCase)); 

यह केवल प्रत्यय का परीक्षण करती है लेकिन मेरे बैकअप फ़ाइलों कि .xml अंत ~ मैच समाप्त करता है।

संबंधित मुद्दे