Dziś temat, który pojawił się podczas mojej ostatniej sesji na portalu VirtualStudy o plikach (niedługo powinna być dostępna pod tym adresem). Pojawiło się pytanie od słuchaczy, czy za pomocą ogólnodostępnych klas w .NET można dobrać się do Alternate Data Stream. Pytanie to zadałem jako zagadkę dla dociekliwych w zamian za konto VIP. Jako, że konkurs już został rozwiązany można przedstawić to dla szerszego grona.
Czym są Alternate Data Stream?
Jest to mechanizm systemu plików NTFS pozwalający tworzyć dodatkowe strumienie danych związane z danym plikiem (stąd nazwa :)). Jak tego użyć?
Co tu się dzieje? Na początku wrzucamy treść do pliku plik.txt i wypisujemy na konsolę jego zawartość. Następnie sprawdzamy poleceniem dir aby się upewnić czy udało się zapisać. Następnie wprowadzamy nową zawartość a jako nazwy pliku używamy plik.txt:ads.txt. W ten sposób określamy, że będzie to Alternate Data Stream. Następnie sprawdzamy rozmiar pliku i wypisujemy ADS na ekran. Widzimy, że mimo wprowadzenia tam dodatkowych danych rozmiar nie uległ zmianie!
A jak w .NET?
Niestety użycie w ADS w .NET nie jest takie proste. Niestety nie wystarczy użyć klasy File jak poniżej
Taki kod da nam wyjątek z informacją, że dany format nie jest wspierany w .NET. A jak z FileStream?
Podobnie jak poprzednio poinformuje, że nie jest on wspierany! Co zatem nam pozostaje? P/Invoke! Za pomocą strony pinvoke.net importujemy definicje metod CreateFile, WriteFile oraz ReadFile.
Mając te definicje wystarczy nam z nich tylko skorzystać!
I voila! Miłego używania Alternate Data Stream!
PS. Zapraszam na swoją kolejną sesję na portalu VirtualStudy podczas, której opowiem o atrybutach i reflection.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl