2011-04-15 10 views
14

मैं FindFirst पर पैरामीटर मान '*1.dat' पास करता हूं, फिर भी पहली फ़ाइल जो FindFirst() नियमित वापसी 46checks5.dat है, बहुत लगातार है।ढूँढें फर्स्ट फर्स्ट फ़ाइल नाम जो मुखौटा से मेल नहीं खाते हैं?

क्या यह ज्ञात समस्या है?

vpath:=trim(vpath); 
result:=true; 
try 
    res:=findfirst(vpath+'\'+vmask,faarchive,search); //vmask = *1.dat 
    try 
    while res=0 do 
    begin 
     vlist.add(search.name); //searchname returned is 46checks5.dat!!! 
     res:=findnext(search); 
    end; 
    finally 
    findclose(search); 
    end; 
except 
    result:=false; 
end; 

उत्तर

23

कारण यह है कि फ़ाइल में "लंबा" नाम है, यानी 8 से अधिक वर्णों के साथ। ऐसी फाइलों के लिए विंडोज "छोटे" नाम भी बनाता है, जो आमतौर पर longna~1.dat रूप में बनाए जाते हैं और यह छोटा नाम *1.dat वाइल्डकार्ड के माध्यम से मिलता है।

आप आसानी से एक खाली निर्देशिका में कमांड प्रॉम्प्ट में एक ही व्यवहार को पुनः कर सकते हैं:

 
C:\TEMP>echo. > 46checks5.dat 
C:\TEMP>dir /x *1.dat 
Volume in drive C has no label. 
Volume Serial Number is 5C09-D9DE 

Directory of C:\TEMP 

2011.04.15 21:37     3 46CHEC~1.DAT 46checks5.dat 
       1 File(s)    3 bytes 

FindFirstFile() के लिए दस्तावेज़, जो FindFirst राज्यों के लिए अंतर्निहित एपीआई है:

खोज शामिल लंबा और छोटा फ़ाइल नाम।

बल्कि FindFirstFile() को डेल्फी के आवरण का उपयोग करने से इस समस्या के वैकल्पिक हल के लिए, फिर,, Win32 एपीआई FindFirstFileEx() कहते हैं। FindExInfoBasicfInfoLevelId पैरामीटर पर पास करें।

+0

हाँ, मैंने इसे यहां देखा: http://blog.excastle.com/2007/10/01/83-backward-compatibility-or -why-dpr-return-dproj-files/हालांकि, यह मेरे प्रश्न को हल नहीं करता है। क्या इसमें कोई फिक्स है, एक काम है, या एक वैकल्पिक समाधान? –

+2

@user मैंने उत्तर में कार्यवाही जोड़ने की स्वतंत्रता ली है। –

+0

धन्यवाद डेविड, मैं इसे एक परीक्षण –

0

आपके पास कुछ और गलत है।

मैं एक फ़ोल्डर C:\Temp\Test बनाया है, और उस में तीन फ़ाइलें डाल:

TestFile1.txt 
TestFile2.txt 
TestFile3.txt 

मैं तो एक नई परियोजना में एक नया खाली फार्म पर एक TMemo छोड़ दिया गया और 'FormCreate' घटना के लिए इस कोड कहा:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    sPath: string; 
    sFile: string; 
    SR: TSearchRec; 
begin 
    sPath := 'C:\Temp\Test'; 
    sFile := '*1.txt'; 

    Memo1.Lines.Clear; 
    if FindFirst(sPath + '\' + sFile, faArchive, SR) = 0 then 
    begin 
    try 
     repeat 
     Memo1.Lines.Add(SR.Name); 
     until FindNext(SR) <> 0; 
    finally 
     FindClose(SR); 
    end; 
    end; 
end; 

जब प्रपत्र दिखाया गया था, TMemo ठीक एक फ़ाइल, TestFile1.txt से पता चला है, बस के रूप में मैं उम्मीद होती है।

+0

मैंने तीन फाइलें बनाई हैं (461checksa1.dat, 46checks1.dat, 46checksa1.dat, 46checks5.dat) और अपने कोड का उपयोग करके, फाइलों में से प्रत्येक को ज्ञापन में दिखाया गया था, जिसमें अंतिम एक, जिसमें '1' नहीं है फ़ाइल नाम में! –

+0

क्षमा करें, मेरा मतलब है कि मैंने चार फाइलें बनाई हैं (उनमें से एक नाम में '1' गायब है) –

+0

जैसा कि मैंने कहा था, आपके पास कुछ गड़बड़ है। मैंने अपनी मौजूदा 'TestFile1.txt' की प्रतिलिपि बनाने के लिए अपनी फाइलों को विस्तारित करने के लिए कॉपी किया है (विस्तार सहित), और '* 1.txt' के बजाय' * 1.dat' देखने के लिए मेरे कोड को संशोधित किया। मुझे ज्ञापन में सूचीबद्ध तीन फ़ाइल मिली: '461checksa1.dat, 46checks1.dat, और 46checksa1.dat'। मेरे कोड में एकमात्र परिवर्तन 'sfile' चर में एक्सटेंशन को' .txt' से '.dat' –

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