Exemple #1
0
        /// <summary>Sortuje pojedynczy plik.</summary>
        /// <param name="plik">Plik do posortowania.</param>
        private void sortujPlik(Plik plik)
        {
            string nazwaPliku = Path.GetFileName(plik.Sciezka);
            //logiAddLine("Sortuję plik " + plik.Sciezka);

            //Kopiujemy plik do Temp i dalej działamy na kopii.
            plik.kopiujPlik(@"Musesort\Temp\");
            plik = Plik.Create(@"Musesort\Temp\" + nazwaPliku, plik.Sciezka);

            string sciezka_katalogu; //Ustalamy ścieżkę katalogu.
            if (schemat == @"Piosenki\Wykonawca" && plik is Utwor && ((Utwor)plik).dane.wykonawca[0] != "" && ((Utwor)plik).dane.tytul != "")
            {
                sciezka_katalogu = @"Musesort\Posegregowane";
                nazwaPliku = ((Utwor)plik).dane.wykonawca[0] + '_' + ((Utwor)plik).dane.tytul + Path.GetExtension(plik.Sciezka);
                plik.zmienNazwePliku(nazwaPliku);
            }
            else
                sciezka_katalogu = sciezka_katalogu_z_pol(plik);

            #region Tworzenie katalogu
            if (!Directory.Exists(sciezka_katalogu))
            {
                string nowyKatalog = sciezka_katalogu; //Używamy nowej zmiennej, by zachować oryginalną ścieżkę na potrzeby logowania błędów.
                while (!Directory.Exists(nowyKatalog))
                {
                    try
                    {
                        Directory.CreateDirectory(nowyKatalog); // to tworzy też wszystkie katalogi które są "po drodze"
                        // tzn. wyższego rzędu które też nie istnieją
                    }
                    catch (NotSupportedException) //Rzucane, gdy w ścieżce wystąpi ':' poza nazwą dysku.
                    {
                        int ostatniDwukropek = nowyKatalog.LastIndexOf(':');
                        if (ostatniDwukropek < nowyKatalog.LastIndexOf('\\')) //Jeśli ostatni dwukropek występuje poza nazwą ostatniego katalogu, nie sortujemy takiego pliku.
                        {
                            string message = "Nie posortowano pliku:\n" + plik.Sciezka
                                + "Gdyż wedle wybranego schematu: " + schemat
                                + "\nGenerowana jest nieprawidłowa (z punktu widzenia systemu) ścieżka:\n'"
                                + sciezka_katalogu + "'";
                            Console.WriteLine(message);
                            logi += message;
                            return;
                        }
                        nowyKatalog = nowyKatalog.Substring(0, ostatniDwukropek); //Obcinamy ostatni dwukropek
                    }
                    catch (ArgumentException) //Rzucane, gdy ścieżka jest pusta lub zaczyna się od ':'
                    {
                        string message = "Nie posortowano pliku:\n" + plik.Sciezka
                            + "Gdyż wedle wybranego schematu: " + schemat
                            + "\nGenerowana jest nieprawidłowa (z punktu widzenia systemu) ścieżka:\n'"
                            + sciezka_katalogu + "'";
                        Console.WriteLine(message);
                        logi += message;
                        return;
                    }
                }
                sciezka_katalogu = nowyKatalog; //Jeśli udało się pomyślnie utworzyć katalog, przepisujemy ostateczną ścieżkę z powrotem.
            }
            #endregion

            //Przenosimy plik.

            try
            {
                plik.przeniesPlik(sciezka_katalogu);
                logi += plik.logi;
            }
            catch (PathTooLongException)
            {
                string message = "Nie posortowano pliku:\n" + plik.Sciezka
                    + "Gdyż wedle wybranego schematu: " + schemat
                    + "\nGenerowana jest nieprawidłowa (konkratnie: za długa) ścieżka:\n'"
                    + sciezka_katalogu + "'";
                Console.WriteLine(message);
                logi += message;
            }
            catch (IOException) //rzucane w przypadku kolizji nazw plików
            {
                duplikat(Plik.Create(Path.Combine(sciezka_katalogu, nazwaPliku)), plik);
            }

            if (progressBar2 != null) progressBar2.PerformStep();
        }
Exemple #2
0
        /// <summary>Przyjmuje dwa plik mające kolizję nazw, decyduje który przenieść do którego katalogu.
        /// </summary>
        /// <param name="plik1"></param>
        /// <param name="plik2"></param>
        /// <param name="preferowaneRozszerzenie">Rozszerzenie które ma pierwszeństwo.</param>
        /// <returns>Czy plik 1 został uznany za lepszy.</returns>
        private bool duplikat(Plik plik1, Plik plik2, string preferowaneRozszerzenie = "")
        {
            logi += "Obsługa duplikatu pliku: " + Path.GetFileName(plik1.Sciezka) + Environment.NewLine ;

            // do decydowania który jest lepszy będziemy używali ifów, chyba prościej będzie najpierw ustalić wartość boola
            bool pierwszy_jest_lepszy = Plik.porownajJakosc(plik1, plik2);

            if (Path.GetExtension(plik1.Sciezka).Substring(1) == preferowaneRozszerzenie)
                if (Path.GetExtension(plik2.Sciezka).Substring(1) != preferowaneRozszerzenie)
                    pierwszy_jest_lepszy = true;
                else if (Path.GetExtension(plik2.Sciezka).Substring(1) == preferowaneRozszerzenie)
                    pierwszy_jest_lepszy = false;

            if (pierwszy_jest_lepszy) //pierwszy plik zostaje gdzie jest, drugi idzie do zduplikowanych
            {
                string nowykatalog = sciezka_katalogu_z_pol(plik2, true);
                Directory.CreateDirectory(nowykatalog);
                plik2.przeniesPlik(nowykatalog);
                logi += plik2.logi;
            }
            else //drugi plik zajmuje miejsce pierwszego, pierwszy idzie do zduplikowanych
            {
                string oryginalnaSciezka = plik1.Sciezka;
                plik1.przeniesPlik(@"Musesort\Zduplikowane\Temp\");
                plik2.przeniesPlik(Directory.GetParent(oryginalnaSciezka).ToString());
                string nowykatalog = sciezka_katalogu_z_pol(plik1, true);
                Directory.CreateDirectory(nowykatalog);
                plik1.zmienNazwePliku(Path.Combine(nowykatalog, Path.GetFileName(plik1.Sciezka)));
                logi += plik2.logi;
                logi += plik1.logi;
            }

            return pierwszy_jest_lepszy;
        }