Cei mai multi dintre noi am folosit Directory.GetFiles. Aceasta metoda statica ne permite sa obtinem lista de fisere dintr-un director dat. De exemplu pentru a obtine toate fisierele din directorul 'C:\Temp' care incep cu 'Test' este nevoie sa apelam metoda GetFiles in felul urmator:
Cauza la acest comportament este urmatoarea: metoda GetFiles() apeleaza la randul ei API de Win32 (metoda FindNextFile). Iar din cauza ca Windows-ul are atat extensii scurte de 3 caractere cat si extensi lungi (8 caractere), rezultatul returnat este cel de mai sus.
O solutie la aceasta problema este sa verificam ca rezultatul returnat se termina cu extensia pe care noi am cautato.
var files = Directory.GetFiles("C:\Temp","Test*");
Exemplul acesta este la mintea cocosului. Dar sa vedem ce se intampa daca vrem toate fiserele cu extensia rar.var files = Directory.GetFiles("C:\Temp","*.rar");
In cazul in care directorul contine urmatoarele fisiere:1.rar
2.rar
3.exe
4.rar.tmp
5.rar1
Rezultatul returnat o sa contina urmatoarele fisiere:1.rar
2.rar
4.rar.tmp
5.rar1
Se pare ca avem o problema, ce cauta ultimele 2 fisiere in rezultat. Ne-am astepta sa fi avut ca rezultat doar 1.rar si 2.rar. Din capate in modul in care am facut noi cautarea, o sa ni se returneze orice fisere care incepe cu regula de cautare pe care noi am folosito. Rezultatul este clar nu cel asteptat.Cauza la acest comportament este urmatoarea: metoda GetFiles() apeleaza la randul ei API de Win32 (metoda FindNextFile). Iar din cauza ca Windows-ul are atat extensii scurte de 3 caractere cat si extensi lungi (8 caractere), rezultatul returnat este cel de mai sus.
O solutie la aceasta problema este sa verificam ca rezultatul returnat se termina cu extensia pe care noi am cautato.
var files = Directory.GetFiles("C:\Temp","*.rar")
.Where( x => x.EndsWIth("*.rar");
Nice :) Sau altfel spus, traiasca backward compatiblity-ul (cu FAT-ul pe 16 biti..) :)
ReplyDeleteMacar un "Remark" pe MSDN ar fi putut pune.
DeletePe MSDN e documentata chestia asta in detaliu din cate vad, desi e clar neintuitiva...
ReplyDeleteMie mi-a scapat, atat mie cat si unui coleg. :)
ReplyDeletehttp://msdn.microsoft.com/en-us/library/wz42302f.aspx ;)
Delete"When using the asterisk wildcard character in a searchPattern, such as "*.txt", the matching behavior when the extension is exactly three characters long is different than when the extension is more or less than three characters long ..."
Multumesc. Am trecut peste textul asta dar nu mi-a sarit in ochi. Eu in locul lor as fi da si un exemplu dupa fraza asta.
DeleteWeekend placut Tudor :)