2011-04-15 19 views
14

'*1.dat' parametre değerini FindFirst dosyasına aktarıyorum, hala FindFirst() rutin dönüşünün 46checks5.dat olduğu ilk dosya, çok tutarlı bir şekilde.FindFirst, neden maskeyle eşleşmeyen dosya adlarını döndürüyor?

bunun bilinen bir sorun var mı?

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; 

cevap

23

nedeni dosyası "uzun" adını, yani 8'den fazla karakterlerle olmasıdır. Bu tür dosyalar için Windows, genellikle longna~1.dat biçiminde oluşturulan "kısa" adlar da oluşturur ve bu kısa ad *1.dat joker karakteri ile bulunur.

Kolayca boş dizinde komut istemine aynı davranışı yeniden edebilirsiniz:

 
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 

FindFirst devletler için temel API olduğunu FindFirstFile() için dokümantasyon,:

arama içerir uzun ve kısa dosya adları.

yerine FindFirstFile() Delphi'nin sarmalayıcı kullanmak yerine, o zaman, bu sorunu gidermek Win32 API FindFirstFileEx() çağırın. FindExInfoBasic parametresini fInfoLevelId parametresine geçirin.

+0

evet, burada gördüm: http://blog.excastle.com/2007/10/01/83-backward-compatibility-or -why-dpr-returns-dproj-files/ancak, benim sorumu çözmez. Buna bir çözüm var mı, etrafta bir çalışma mı yoksa alternatif bir çözüm mü? –

+2

@user Yanıtın geçici çözümünü ekleme özgürlüğünü aldım. –

+0

Teşekkürler David, ben –

0

Başka bir sorununuz var.

Ben bir klasör C:\Temp\Test oluşturulan ve içinde üç dosya koyun:

TestFile1.txt 
TestFile2.txt 
TestFile3.txt 

Sonra yeni bir projede yeni bir boş form üzerinde bir TMemo düştü ve 'FormCreate' etkinliğine bu kodu eklendi:

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; 

formu gösterildi

, TMemo ben beklenebilir gibi, tam olarak bir dosya, TestFile1.txt gösterdi.

+0

Üç dosya oluşturdum (461checksa1.dat, 46checks1.dat, 46checksa1.dat, 46checks5.dat) ve kodunuzu kullanarak, dosyadaki herkes, sonuncusu da dahil olmak üzere notta gösterildi. dosya isminde! –

+0

Üzgünüm, demek istediğim dört dosya oluşturdum (bunlardan biri adında '1' eksik). –

+0

Dediğim gibi, yanlış bir şeyiniz var. Sadece var olan 'TestFile1.txt' adlı dosyamı, sizinkiyle aynı adlı dört dosya (uzantı dahil) yapmak için kopyaladım ve kodumu' * 1.txt' yerine '* 1.dat' aramak için değiştirdim. Notta listelenen üç dosya var: '461checksa1.dat, 46checks1.dat ve 46checksa1.dat'. Kodumdaki tek değişiklik, 'sfile' değişkenindeki uzantının' .txt' ile '.dat' arasında değişmesiydi. –

İlgili konular