piątek, 8 sierpnia 2008

bug w getfiles?

Ostatnio chcialem wydobyc pliki z folderu o określonym rozszerzeniu. W takim przypadku należy skorzystać ze statycznej metody GetFiles z klasy Directory lub DirectoryInfo. Metoda w 2 przeciążonych wywołaniach przyjmuje string oznaczony jako searchPattern. Atrybut ten niestety nie może przyjąć więcej jak jedno rozszerzenie. Co więc zrobić jeśli chcemy poszukać kilku typów plików?

Jedna z metod jest taka żeby GetFiles wykonać na każdym rozszerzeniu i dołączać kolejne wyniki czyli:

ArrayList files = new ArrayList();

foreach (string ext in m_ScanExtensionsList)
{
string[] temp = Directory.GetFiles(path, ext);
if (temp.Length > 0)
{
files.AddRange(temp);
}
}

Niby do zaakceptowania ale:
  • trzeba pamiętać żeby ext bylo w formacie "*.doc"
  • GetFiles zachowuje się dobrze do momentu jeśli poszukwane rozszerzenie ma mniej lub więcej niż 3 znaki. Jeśli będziemy szukać "*.doc" to GetFiles zwroci takze docx, doct, etc. Jeśli będziemy szukać "*.docx" to GetFiles zwróci tylko docx. Czyli w przypadku 3 literowych rozszerzen GetFiles traktuje to tak jakby występowala na koncu * (znak zastepujacy dowolna ilosc znakow). Jest to podobno związane z historycznym 8.3 z DOSa.
Co więcej dokładnie tak zachowuje się koneda systemowa:

C:\Documents and Settings\mak>dir c:\*.xls
Volume in drive C has no label.
Volume Serial Number is 6856-6816

Directory of c:\

06/06/2008 05:52 PM 82,491 20080606 Feature3.xlsx
06/05/2008 10:29 AM 34,915 20080605 Work breakdown v0.05.xlsx
05/29/2008 11:56 AM 16,523 MAK_Plan.xlsx
06/05/2008 03:57 PM 98,816 WeekPlan v0 3.xls
4 File(s) 232,745 bytes
0 Dir(s) 1,040,863,232 bytes free

C:\Documents and Settings\mak>

Druga metoda zeby wyciagnąc wiecej niż jedno rozszerzenie:

DirectoryInfo directory = new DirectoryInfo(path);

ArrayList files = new ArrayList();

foreach (FileInfo file in directory.GetFiles())
{
string ext = file.Extension.ToUpper();
if (m_ScanExtensionsList.Contains(ext))
files.Add(file.FullName);

}

Pytamy więc o wszystkie pliki a później filtrujemy wyniki.

Brak komentarzy: