/// <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(); }
/// <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; }