Czy mogę pokazać postęp kopiowania plików za pomocą FileInfo.CopyTo () w .NET?

Stworzyłem narzędzie do kopiowania w c # (.NET 2.0 Framework), które kopiuje pliki, katalogi i rekurencyjne podkatalogi itp. Program ma GUI, który pokazuje aktualny kopiowany plik, aktualny numer pliku (sekwencję), całkowitą liczbę plików do skopiowania i procent ukończony dla operacji kopiowania. Istnieje również pasek postępu, który jest oparty na bieżących plikach / całych plikach.

Mój problem związany jest z kopiowaniem dużych plików. Nie udało mi się znaleźć sposobu wskazania całkowitego postępu kopiowania dużego pliku (używając mojej obecnej struktury klas, która wykorzystuje metodę FileInfo.CopyTo). Jako obejście oddzieliłem operacje kopiowania plików i wyświetlanie GUI od ich własnych wątków i ustawiłem wizualną wskazówkę, aby pokazać, że praca jest wykonywana. Użytkownik przynajmniej wie, że program nie jest zamrożony i nadal kopiuje pliki.

Byłoby lepiej, gdybyśmy mogli pokazać postęp w oparciu o całkowitą liczbę bajtów lub mieć jakieś zdarzenie, które wywołuje metoda FileInfo.CopyTo wskazująca całkowitą liczbę bajtów skopiowanych z bieżącego pliku.

Jestem świadomy właściwości FileInfo.Length, więc jestem pewien, że istnieje sposób, w jaki MacGuyver jest moim własnym zdarzeniem, które bazuje na tym i ma obsługę po stronie GUI rzeczy czytających aktualizacje (być może na podstawie sprawdzania FileInfo. Właściwość length obiektu docelowego przy użyciu jakiegoś typu timera?).

Czy ktoś wie, jak to zrobić, że nie widzę. Gdybym mógł tego uniknąć, wolałbym nie przepisywać mojej klasy, aby kopiować bajty przez strumień i śledzić go w ten sposób (choć myślę, że mogę utknąć na tej trasie).

Z góry dziękuję

PS - Na razie utknąłem w środowisku .NET 2.0, więc każde rozwiązanie, które wymaga funkcji dostępnych tylko w wersji> = 3.0, nie jest dla mnie rozwiązaniem.

PPS - Jestem otwarty na rozwiązania w dowolnej wersji językowej .NET, nie tylko c #.

questionAnswers(7)

yourAnswerToTheQuestion