Pomoc w przetłumaczeniu programu wsadowego na C#.net

0

Witam,
Jestem bardzo początkującym samoukiem (znam absolutne podstawy html, javascript i dosłownie wczoraj zacząłem pracę z VisualStudio używając C#).

Potrzebowałem stworzyć program A, który pozwoli mi podmienić pliki graficzne w programie B w taki sposób by program B tego nie "zauważył" i nie spróbował przywrócić zmian (program B każdorazowo po uruchomieniu łączy się z internetem i sprawdza zawartość folderów, którą chcę zmienić). Jako, że moje umiejętności są mierne użyłem najprostszego możliwego sposobu: napisałem skrypt w formie pliku .bat który wygląda następująco:

  
copy .\Folder1\Folder2\*.* .\FolderA\FolderB /y
copy .\Folder1\Folder3\*.* .\FolderA\FolderC /y
copy .\Folder1\Folder4\*.* .\FolderA\FolderD /y
copy .\Folder1\Folder5\*.* .\FolderA\FolderE /y

ECHO OFF

start program B.exe

Echo .
Echo .
Echo .
Echo Użytkowniku wykonaj instrukcję.
Echo Następnie wciśnij ENTER.

SET /P M=.

copy .\FolderI\FolderII\*.* .\FolderA\FolderB /y
copy .\FolderI\FolderIII\*.* .\FolderA\FolderC /y
copy .\FolderI\FolderIV\*.* .\FolderA\FolderD /y
copy .\FolderI\FolderV\*.* .\FolderA\FolderE /y

Teraz chciałbym do powyższego dorzucić GUI i najlepszym sposobem wydało mi się stworzenie Windows Form Application w VS Express przy użyciu C#. Problem polega na tym, że znam tylko absolutne podstawy C# (niewiele ponad poziom pisania programów w stylu Hello World) i w odróżnieniu od bardzo prostego .bat nie udało mi się napisać kodu samemu. Próbowałem googlować, dowiedziałem się co to metoda File.Copy etc. ale ostatecznie zadanie mnie przytłoczyło.

W związku z powyższym prośba. Jeśli ktoś byłby w stanie "przetłumaczyć" dla mnie powyższy prosty skrypt na C#.net albo pomógł mi zrozumieć czego potrzebuję, by zrobić to samemu byłbym ogromnie wdzięczny.

Pozdrawiam!

1

Cześć,

Kopiowanie możesz wykonać na kilka sposobów np. za pomocą klasy DirectoryInfo

 
  private static void CopyFiles(string source, string destiny, string pattern = "*.*")
        {
            DirectoryInfo dir1 = new DirectoryInfo(source);
            DirectoryInfo dir2 = new DirectoryInfo(destiny);

            if (!dir1.Exists)
                throw new ArgumentException(source);            
            else
            {
                if (!dir2.Exists)
                    dir2.Create();

                FileInfo[] files = dir1.GetFiles(pattern);
                
                foreach (var item in files)
                {
                    item.CopyTo(Path.Combine(dir2.FullName, item.Name));
                }
            }
        }

     static void Main(string[] args)
        {
            CopyFiles(@".\FolderI\FolderII\", @".\FolderA\FolderB","a.*");
            CopyFiles(@".\FolderI\FolderIII\", @".\FolderA\FolderC");
            CopyFiles(@".\FolderI\FolderIV\", @".\FolderA\FolderD");
            CopyFiles(@".\FolderI\FolderV\", @".\FolderA\FolderE");
        }
1
Jestem super wdzięczny za pomoc, ogarnąłem już co robi każda linijka kodu z posta M4nieq, ogarnąłem gdzie powinien się znajdować etc. Mam jednak jeszcze jedno pytanie. Jak zmodyfikować powyższy kod w taki sposób by zastąpił (nadpisał) on pliki znajdujące się w DirectoryInfo dir2 = new DirectoryInfo(destiny); ? Poza tym czy da się do funkcji CopyFiles dopisać kod, który będzie wyświetlał komunikat jeśli kopiowanie zakończyło się sukcesem?
item.CopyTo(Path.Combine(dir2.FullName, item.Name),true);//zezwala na nadpisanie pliku

Co do drugiego pytania, za pętlą foreach po prostu daj MessageBox.Show("Skopiowano");
To w ogóle powinno byś w bloku try catch bo jeśli kopiowanie się nie powiedzie wywali Ci program.

0
dam1an napisał(a):

To w ogóle powinno byś w bloku try catch bo jeśli kopiowanie się nie powiedzie wywali Ci program.

Gdzie dokładnie umieścić blok Try-Catch w funkcji i jak powinien wyglądać? Umieścić coś takiego po foreach?

 try
        {            
             item.CopyTo(Path.Combine(dir2.FullName, item.Name), true);
        }

        catch (Exception e)
        {
            Console.WriteLine("{0} Wystąpił błąd!.", e);
        }

A może samo foreach powinno znaleźć się w bloku try-catch?

I jeszcze raz ogromnie dziękuję za pomoc

1

Nie wiem sam wybierz. Jeśli dasz cały foreach to po pierwszym błędzie przestanie próbować skopiować inne pliki. Jeśli samą linijkę to dalej będzie próbował skopiować następne pliki.

0

Ok obecnie funkcja wygląda tak i działa;)

        private static void CopyFiles(string source, string destiny, string pattern = "*.*")
        {
            DirectoryInfo dir1 = new DirectoryInfo(source);
            DirectoryInfo dir2 = new DirectoryInfo(destiny);

            if (!dir1.Exists)
                throw new ArgumentException(source);
            else
            {
                if (!dir2.Exists)
                    dir2.Create();

                FileInfo[] files = dir1.GetFiles(pattern);

                try
                {
                    foreach (var item in files)
                    {
                        item.CopyTo(Path.Combine(dir2.FullName, item.Name), true);
                    }
                }

                catch (DirectoryNotFoundException)
                {
                    MessageBox.Show("Error!");
                }

               
            }
        }

Dzięki ogromne @dam1an i @M4nieq! Naprawdę sporo się w tym temacie nauczyłem.

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