Monitorowanie rozmiaru kopiowanego pliku

0

Witam wszystkich,
wiem ze podobny temat juz byl ale jakos ja nie moge sobie z tym poradzic.. :/
A mianowicie, jak mozna efektywnie monitorować rozmiar kopiowanego pliku?? Bo polaczenie metod FileSystemWatcher i kopiowany_plik.Length jakos sobie chyba z tym nie radza, tzn program od razu podaje ile bedzie wynosil koncowy rozmiar kopiowanego pliku, a mi chodzi o to zeby na biezacao podawal jaka ilosc danych zostala skopiowania. Dobrze by bylo rowniez obslugiwac tu pasek postepu ;-)

Mam nadzieje ze ktos ma jakikolwiek pomysl :-) z gory dziex za pomoc, pozdrawiam

0

Witam,
zawsze możesz sam obsłużyć kopiowanie plików ;)
Kiedyś zrobiłem taką klasę - mi wystarczyła

    public delegate void CopyProgressDelegate();

    public class FileService
    {
        private const int BufferLenght = 1024;
        private int mBufforCount;
        private FileInfo mSource;

        public event CopyProgressDelegate CopyProgress;

        public FileService(string source)
        {
            this.mSource = new FileInfo(source);
            CheckFile(this.mSource);
            if (this.mSource.Length <= BufferLenght)
                this.mBufforCount = 1;
            else
                this.mBufforCount = Convert.ToInt32(Math.Ceiling(((double)this.mSource.Length / (double)BufferLenght)));
        }

        public int BufforCount
        {
            get { return this.mBufforCount; }
        }

        public void CopyTo(string destination)
        {
            FileInfo destinationInfo = new FileInfo(destination);
            FileStream reader = null;
            FileStream writer = null;
            byte[] buffer = new byte[BufferLenght];
            int readbytes;
            try
            {
                reader = this.mSource.OpenRead();
                if (!destinationInfo.Exists)
                    writer = destinationInfo.Create();
                else
                    writer = File.Open(destination, FileMode.OpenOrCreate, FileAccess.Write);
                for (int i = 0; i < this.mBufforCount; i++)
                {
                    readbytes = reader.Read(buffer, 0, BufferLenght);
                    writer.Write(buffer, 0, readbytes);
                    writer.Flush();
                    if (CopyProgress != null)
                        CopyProgress();
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (reader != null) reader.Close();
                if (writer != null) writer.Close();
            }
        }

        private void CheckFile(FileInfo source)
        {
            if (String.IsNullOrEmpty(source.Name))
                throw new ArgumentNullException("Pierwszy parametr nie moze byc pusty !");
            if (!source.Exists)
                throw new ArgumentException(String.Format("Plik: {0} nie istnieje", source.Name));
        }

Przykład użycia:

        private static void CopyFileTest()
        {
            try
            {
                string source = @"C:\liczba.txt";
                string destination = @"C:\liczba1.txt";
                FileService service = new FileService(source);
                service.CopyProgress += new CopyProgressDelegate(service_CopyProgress);
                service.CopyTo(destination);
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.ToString());
            }
        }

        static void service_CopyProgress()
        {
            Console.Write("*");
        }

Mam nadziej że znajdziesz coś dla siebie ;)

Pozdrawiam

0

OK kopiowanie działa ale mi chodzi o to żeby program na bieżąco podawał ilość skopiowanych danych. i Jak do tego dodać pasek postępu w WindowsForms??

0

Wszystko masz na tacy. Wykaż trochę inicjatywy.

0

adf88, to co mi zapodales to chyba bedzie dobry pomysl ale ja z tym kombinuje i jakos nic nie wychodzi, ciagle wywala bledy. No coz jestem bardzo poczatkujacy :-/ prosze tylko w miare mozliwosci o wytlumaczenie mi pewnej sprawy

public delegate int ProgressCallback(
   long totalSize, long totalTransfered, long streamSize, 
   long streamTransfered, int streamNumber, int callbackReason,
   IntPtr hSourceFile, IntPtr hDestFile, IntPtr data);

   [DllImport("Kernel32.dll")]
   public static extern bool CopyFileEx(String existingFileName, String
   newFileName, ProgressCallback callback, IntPtr callbackData,
   bool cancel, int copyFlags);

   CopyFileEx(fromFile, toFile, new ProgressCallback(<font color="red">Progress</font>), 
   IntPtr.Zero, false, <font color="red">COPY_FILE_RESTARTABLE</font>);

Kompilator podkresla mi to co zaznaczylem tutaj na czerwono..
Pierwszy blad: The name 'Progress' does not exist in the current context
a drugi brzmi tak samo tylko dotyczy wyrazenia COPY_FILE_RESTARTABLE
jak rozwiazac ten problem??

0

'Progress' to musi być twoja metoda. Metoda która ustawi pozycję ProgressBar'a. Parametry jakie przyjmuje ta metoda są określone przez delegate 'ProgressCallback'. W nich jest wszystko co potrzebujesz (totalSize, totalTransfered, dwCallbackReason). Jeśli chcesz przerwać kopiowanie, to twoja metoda 'Progress' musi zwrócić wartość PROGRESS_CANCEL (normalnie PROGRESS_CONTINUE aby kontynuować).

Musisz sobie samemu zdefiniować stałe COPY_FILE_RESTARTABLE, PROGRESS_CONTINUE itd. Ich wartości znajdziesz w pliku WinBase.h.
np. PROGRESS_CONTINUE zdefiniuj tak:

const int PROGRESS_CONTINUE = 0;

1 użytkowników online, w tym zalogowanych: 0, gości: 1