Ciekawy problem - warunek na dostępność pliku

0

Witam serdecznie,

od jakiegoś już czasu uczę się programować w języku c#. Ostatnio natchnęło mnie na wykonanie pewnego projektu, niestety mówiąc szczerze utknąłem i właśnie stąd ten temat...
Co będzie zadaniem programu samo w sobie nie jest istotne, natomiast istotne jest to, że jednym z zadań programu będzie kopiowanie plików w czasie rzeczywistym - tzn. jeżeli plik pojawi się w danej lokalizacji ma zostać natychmiast skopiowany gdzie indziej.

Zastosowałem niekończącą się pętlę for. Wszystko "gra" pod warunkiem, że plik jest mały, w innym przypadku program się wywala i wyskakuje błąd o treści mniej więcej: "nie można uzyskać dostępu do pliku gdyż jest używany przez inny proces" - plik podczas kopiowania jest niedostępny dla operacji kopiowania.
Oczywiście da rade obejść to poprzez np komendę Thread.Sleep(xxx) jednak będzie to mało efektywne.
Szukam sposobu na warunek o treści: "jeżeli plik dostępny to .....", próbowałem utworzyć zmienną boolean, a później w pętli while się do niej odwołać("próbuj do skutku") jednak to również nie przyniosło spodziewanego efektu.

Dlatego zwracam się do Szanownych Koleżanek i Kolegów o pomoc, za wszelkie podpowiedzi będę niezmiernie wdzięczny.

Pozdrawiam

0
Ekoday napisał(a)

komendę Thread.Sleep(xxx)

To metoda, nie komenda. W C# nie ma komend, to język obiektowy.

Powiedz w ogóle w jaki sposób kopiujesz plik? Pokaż kod.

0

Oczywiście metoda, mój błąd.
kod:

            string karta = @"d:\proba\folder1";
            string dysk = @"d:\proba";

            try
            {
                for (; ; )
                {
                    string[] NEF = Directory.GetFiles(karta, "*.nef");
                    foreach (string f in NEF)
                    {

                        string fName = f.Substring(karta.Length + 1);
                        File.Copy(Path.Combine(karta, fName), Path.Combine(dysk, fName), true);
                    }

                    foreach (string f in NEF)
                    {
                        File.Delete(f);

                    }

                    System.Threading.Thread.Sleep(2000);

                }

            }

            catch (DirectoryNotFoundException)
            {
                MessageBox.Show("Nie ma pliku do skopiowania!");

            } 
3

Plik, który jest w trakcie kopiowania nie może zostać otwarty zanim nie zostanie skopiowany w całości. Pętla to niezbyt dobry pomysł sprawdzania czy jest coś nowego jeśli chodzi o dysk lokalny. Do tego została wymyslona klasa FileSystemWatcher. Jeśli pojawi się nowy plik to najpierw musisz sprawdzić, czy da się go otworzyć. Jak się da to kopiuj a jak nie to poczekaj chwilę (500ms np.) i spróbuj ponownie. Do tego wystarczy prosta pętla i try except

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