static void Main(string[] args)
        {
            int               DISK_PAGE_SIZE = 4096;//MULTITUDE OF 4
            string            mainFileName   = "MainFile.txt";
            string            tape1Name      = "tape1.txt";
            string            tape2Name      = "tape2.txt";
            string            tape3Name      = "tape3.txt";
            int               amount;
            int               max;
            bool              showSum;
            int               option;
            bool              show;
            RunInfo           ri;
            DiskFunctionality df        = new DiskFunctionality(DISK_PAGE_SIZE, mainFileName, tape1Name, tape2Name, tape3Name);
            Generator         generator = new Generator(df);



            Console.WriteLine("1 - Generate automatically");
            Console.WriteLine("2 - Generate from keyboard");
            Console.WriteLine("3 - Generate from file");
            option = Int32.Parse(Console.ReadLine());
            if (option == 1)
            {
                Console.WriteLine("Set amount of numbers");
                amount = Int32.Parse(Console.ReadLine());
                if (amount < 1)
                {
                    Console.WriteLine("Amount of numbers must be grater than 0");
                    return;
                }
                Console.WriteLine("Set maximum value of a number");
                max = Int32.Parse(Console.ReadLine());
                if (max < 1)
                {
                    Console.WriteLine("Maximum number must be grater than 0");
                    return;
                }
                generator.Generate(amount, max);
            }
            else if (option == 2)
            {
                amount = generator.GenerateFromKeyboard();
                if (amount < 1)
                {
                    Console.WriteLine("Amount of numbers must be grater than 0");
                    return;
                }
            }
            else if (option == 3)
            {
                amount = generator.GenerateFromFile();
                if (amount < 1)
                {
                    Console.WriteLine("Amount of numbers must be grater than 0");
                    return;
                }
            }
            Console.WriteLine("Show file after every phase of sorting? y/n");
            string phaseAsnwear = Console.ReadLine();

            if (phaseAsnwear == "y")
            {
                show = true;
            }
            else
            {
                show = false;
            }
            Console.WriteLine("Show sum of divisors next to each number? y/n");
            string showSumAnswear = Console.ReadLine();

            if (showSumAnswear == "y")
            {
                showSum = true;
            }
            else
            {
                showSum = false;
            }
            Console.WriteLine("File before sorting:");
            df.OpenReadStream(mainFileName);
            df.ShowFileContent(mainFileName, showSum);
            df.CloseStream(mainFileName);
            df.OpenReadStream(mainFileName);
            Console.WriteLine("Number of runs in file: " + df.GetNumberOfRuns(mainFileName));
            df.CloseStream(mainFileName);


            ri = DivideBetweenTapes(df, mainFileName, tape1Name, tape2Name);

            FibonacciMerge(df, ri, tape1Name, tape2Name, tape3Name, show, showSum);
            int r   = df.GetNumberOfReadOperations();
            int w   = df.GetNumberOfWriteOperations();
            int sum = r + w;

            Console.WriteLine("Number of disk operations: " + sum);
        }
        public static void FibonacciMerge(DiskFunctionality df, RunInfo ri, string tape1, string tape2, string tape3, bool show, bool showDiv)
        {
            int    phases = 0;
            int    input1Runs = ri.GetRuns(tape1), input2Runs = ri.GetRuns(tape2);
            string input1 = tape1, input2 = tape2, output = tape3;

            Console.WriteLine("Phase " + phases + " finished. Tape content:");
            if (show)
            {
                df.OpenReadStream(input1);
                df.OpenReadStream(input2);
                Console.WriteLine("\n" + input1 + " content:");
                df.ShowFileContent(input1, showDiv);
                Console.WriteLine("\n" + input2 + " content:");
                df.ShowFileContent(input2, showDiv);
                df.CloseStream(input1);
                df.CloseStream(input2);
            }
            df.OpenReadStream(input1);
            df.OpenReadStream(input2);
            df.OpenSaveStream(output);
            while (true)
            {
                if (input1Runs > input2Runs)
                {
                    for (int i = 0; i < input2Runs; i++)
                    {
                        MergeRuns(df, input1, input2, output);
                    }
                    input1Runs -= input2Runs;
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    df.CloseStream(input2);
                    phases++;
                    Console.WriteLine("Phase " + phases + " finished. Tape content:");
                    if (show)
                    {
                        df.OpenReadStream(output);
                        Console.WriteLine("\n" + input1 + " content:");
                        df.ShowFileContent(input1, showDiv);
                        Console.WriteLine("\n" + output + " content:");
                        df.ShowFileContent(output, showDiv);
                        df.CloseStream(output);
                    }



                    swap(ref input2, ref output);
                    df.OpenSaveStream(output);
                    df.OpenReadStream(input2);
                }
                else if (input1Runs < input2Runs)
                {
                    for (int i = 0; i < input1Runs; i++)
                    {
                        MergeRuns(df, input1, input2, output);
                    }
                    input2Runs -= input1Runs;
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    df.CloseStream(input1);
                    phases++;

                    Console.WriteLine("Phase " + phases + " finished. Tape content:");
                    if (show)
                    {
                        df.OpenReadStream(output);
                        Console.WriteLine("\n" + input2 + " content:");
                        df.ShowFileContent(input2, showDiv);
                        Console.WriteLine("\n" + output + " content:");
                        df.ShowFileContent(output, showDiv);
                        df.CloseStream(output);
                    }



                    swap(ref input1, ref output);
                    df.OpenSaveStream(output);
                    df.OpenReadStream(input1);
                }
                else if (input1Runs == 1 && input2Runs == 1)
                {
                    MergeRuns(df, input1, input2, output);
                    df.CloseStream(input1);
                    df.CloseStream(input2);
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    phases++;
                    Console.WriteLine("\n" + "File after sorting:");
                    df.OpenReadStream(output);
                    df.ShowFileContent(output, true);
                    df.CloseStream(output);
                    Console.WriteLine("Number of phases: " + phases);
                    return;
                }
            }
        }