Czy mogę pokazać postęp kopiowania plików za pomocą FileInfo.CopyTo () w .NET?
Stworzyłem narzędzie kopiowania w c # (.NET 2.0 Framework), które kopiuje pliki, katalogi i podkatalogi rekurencyjne itp. Program posiada GUI, który pokazuje aktualnie kopiowany plik, aktualny numer pliku (sekwencję), łączną liczbę plików do skopiowania oraz procent wykonanych operacji kopiowania. Istnieje również pasek postępu, który jest oparty na bieżącym pliku/łącznej liczbie plików.
Mój problem polega na kopiowaniu dużych plików. Nie udało mi się znaleźć sposobu, aby wskazać ogólny postęp kopiowania dużego pliku (przy użyciu mojej obecnej struktury klasy przy użyciu metody FileInfo.CopyTo). Aby obejść ten problem, podzieliłem operacje kopiowania plików i wyświetlania GUI na własne wątki i ustawiłem wizualną wskazówkę, aby pokazać, że praca jest w toku. Przynajmniej użytkownik wie, że program nie jest zawieszony i nadal kopiuje pliki.
Lepiej byłoby móc pokazać postęp na podstawie całkowitej liczby bajtów lub mieć jakiś rodzaj zdarzenia, które jest uruchamiane z metody FileInfo.CopyTo, wskazując całkowitą liczbę bajtów skopiowanych z bieżącego pliku.
Wiem o właściwości FileInfo.Length, więc jestem prawie pewien, że istnieje sposób MacGuyver na moje własne zdarzenie, które jest na niej oparte, i istnieje program obsługi GUI dla rzeczy odczytujących aktualizacje (prawdopodobnie oparty na sprawdzeniu FileInfo.Length właściwość celu z jakim zegarem?).
Czy ktoś zna sposób na zrobienie tego, którego ja przeoczam? Jeśli mogę tego uniknąć, wolałbym raczej nie przepisywać mojej klasy, aby kopiować bajty w strumieniu i śledzić to w ten sposób (chociaż myślę, że utknę w tej trasie).
z góry dziękuję
PS - W tej chwili utknąłem na frameworku .NET 2.0, więc żadne rozwiązanie wymagające funkcji dostępnych tylko w & > = 3.0 nie działa dla mnie.
PPS jest otwarty na rozwiązania w dowolnym języku .NET, nie tylko w języku C #.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
7 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Jednak metoda CopyFileEx robi to i możesz napisać wokół niego własne opakowanie .NET w ciągu kilku minut, jak opisano tutaj:
http://www.pinvoke.net/ default.aspx- i kernel32.CopyFileEx
http://www.pinvoke.net/default ... ileEx
Anonimowy użytkownik
Potwierdzenie od:
zaznaczona odpowiedź
https://stackoverflow.com/a/187842/73025... Jednak później stworzyłem opakowanie, aby zapewnić lepsze ™ API do korzystania z .NET.
Za pomocą
:
Realizacja
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
CopyFileEx potraktuje Cię dobrze lub możesz zaimplementować BackgroundWorker, który monitoruje rosnący rozmiar pliku docelowego i aktualizuje pasek postępu o te informacje. Ta ostatnia metoda oszczędza PInvoke, ale ta pierwsza jest prawdopodobnie trochę czystsza na dłuższą metę.
Anonimowy użytkownik
Potwierdzenie od:
Tak, musisz połączyć się z zestawem Microsoft.VisualBasic. ja
zakochać się
http://www.deploymentzone.com/ ... asic/
to jest montaż.
Anonimowy użytkownik
Potwierdzenie od:
Rozszerzyłem odpowiedź Dennisa o kopię przerwania
Klienci mogą utworzyć obiekt klasy XCopy i wywołać metodę copy/abort.
Anonimowy użytkownik
Potwierdzenie od:
Sprawdź to tutaj -
GitHub
https://github.com/martinchrza ... nager
i
Nuget
https://www.nuget.org/packages ... ager/