private void przeskoczWykaz(FileStream fileStream)
 {
     ZawartośćPliku[] wkzPlikiNames = new ZawartośćPliku[Stream_ReadUInt(fileStream)];
     for (int i = 0; i < wkzPlikiNames.Length; i++)
     {
         wkzPlikiNames[i]            = new ZawartośćPliku();
         wkzPlikiNames[i].nazwaPliku = Stream_ReadString(fileStream);
         wkzPlikiNames[i].crc32      = Stream_ReadUInt(fileStream);
         wkzPlikiNames[i].itag       = Stream_ReadUInt(fileStream);
     }
     string[] wkzTeczkiNames = new string[Stream_ReadUInt(fileStream)];
     for (int i = 0; i < wkzTeczkiNames.Length; i++)
     {
         wkzTeczkiNames[i] = Stream_ReadString(fileStream);
         przeskoczWykaz(fileStream);
     }
 }
        private void wyjaśnijTeczkę(FileStream fileStream, string filePath, uint poziom)
        {
            List <ZawartośćPliku> plikiNames  = new List <ZawartośćPliku>();
            List <string>         teczkiNames = new List <string>();

            { //wgraj pliki z teczkami ze ścieżki
                WIN32_FIND_DATA findData;
                IntPtr          hFile = FindFirstFileEx(filePath + "*", FINDEX_INFO_LEVELS.FindExInfoBasic, out findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, 0);
                if (hFile.ToInt32() != -1)
                {
                    do
                    {
                        if ((findData.dwFileAttributes & 0x10) != 0x10)
                        {
                            plikiNames.Add(new ZawartośćPliku()
                            {
                                nazwaPliku = findData.cFileName
                            });
                        }
                        else if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            teczkiNames.Add(findData.cFileName);
                        }
                    }while (FindNextFile(hFile, out findData));
                    FindClose(hFile);
                }
            }
            { //wgraj crc32 oraz itag ze ścieżki
                for (int i = 0; i < plikiNames.Count; i++)
                {
                    Crc32 crc32 = new Crc32();
                    try
                    {
                        byte[] allFileBytes = File.ReadAllBytes(filePath + plikiNames[i].nazwaPliku);
                        plikiNames[i].crc32 = crc32.Append(0, allFileBytes, 0, allFileBytes.Length);
                        plikiNames[i].itag  = Program.liczItag(allFileBytes);
                    }
                    catch (Exception ex)
                    {
                        plikiNames[i].crc32 = 0;
                        plikiNames[i].itag  = 0;
                    }
                }
            }
            ZawartośćPliku[] wkzPlikiNames = new ZawartośćPliku[Stream_ReadUInt(fileStream)];
            { //wgraj pliki z wykazu
                for (int i = 0; i < wkzPlikiNames.Length; i++)
                {
                    wkzPlikiNames[i]            = new ZawartośćPliku();
                    wkzPlikiNames[i].nazwaPliku = Stream_ReadString(fileStream);
                    wkzPlikiNames[i].crc32      = Stream_ReadUInt(fileStream);
                    wkzPlikiNames[i].itag       = Stream_ReadUInt(fileStream);
                }
            }
            { //postanów o zmienionych, usuniętych, wtórnych plikach
                for (int i = 0; i < wkzPlikiNames.Length; i++)
                {
                    bool isWykazInPliki = false;
                    for (int j = 0; j < plikiNames.Count; j++)
                    {
                        if (plikiNames[j].nazwaPliku == wkzPlikiNames[i].nazwaPliku && (plikiNames[j].crc32 != wkzPlikiNames[i].crc32 || plikiNames[j].itag != wkzPlikiNames[i].itag))
                        {
                            piszPlikZmieniony(poziom, wkzPlikiNames[i].nazwaPliku);
                            isWykazInPliki = true;
                            break;
                        }
                        else if (plikiNames[j].nazwaPliku == wkzPlikiNames[i].nazwaPliku)
                        {
                            isWykazInPliki = true;
                            break;
                        }
                    }
                    if (!isWykazInPliki)
                    {
                        piszPlikUsunięty(poziom, wkzPlikiNames[i].nazwaPliku);
                    }
                }
                foreach (ZawartośćPliku plikName in plikiNames)
                {
                    bool isPlikInWykaz = false;
                    for (int i = 0; i < wkzPlikiNames.Length; i++)
                    {
                        if (plikName.nazwaPliku == wkzPlikiNames[i].nazwaPliku)
                        {
                            isPlikInWykaz = true;
                            break;
                        }
                    }
                    if (!isPlikInWykaz)
                    {
                        piszPlikWtórny(poziom, plikName.nazwaPliku);
                    }
                }
            }
            string[] wkzTeczkiNames = new string[Stream_ReadUInt(fileStream)];
            { //przetwórz teczki wykazu
                for (int i = 0; i < wkzTeczkiNames.Length; i++)
                {
                    wkzTeczkiNames[i] = Stream_ReadString(fileStream);
                    bool isWykazInTeczkiNames = false;
                    for (int j = 0; j < teczkiNames.Count; j++)
                    {
                        if (teczkiNames[j] == wkzTeczkiNames[i])
                        {
                            isWykazInTeczkiNames = true;
                            break;
                        }
                    }
                    if (!isWykazInTeczkiNames)
                    {
                        piszTeczkaUsunięta(poziom, wkzTeczkiNames[i]);
                        przeskoczWykaz(fileStream);
                    }
                    else
                    {
                        textBox1.Text = filePath + wkzTeczkiNames[i];
                        textBox1.Refresh();
                        Application.DoEvents();
                        {//powiadom xml o zmiannie teczki
                            piszPlikZmieniony(poziom, "<" + wkzTeczkiNames[i] + ">");
                            piszPlikUsunięty(poziom, "<" + wkzTeczkiNames[i] + ">");
                            piszPlikWtórny(poziom, "<" + wkzTeczkiNames[i] + ">");
                            piszTeczkaUsunięta(poziom, "<" + wkzTeczkiNames[i] + ">");
                            piszTeczkaWtórna(poziom, "<" + wkzTeczkiNames[i] + ">");
                        }
                        wyjaśnijTeczkę(fileStream, filePath + wkzTeczkiNames[i] + "\\", poziom + 1);
                        {//powiadom xml o powrocie
                            piszPlikZmieniony(poziom, "</>");
                            piszPlikUsunięty(poziom, "</>");
                            piszPlikWtórny(poziom, "</>");
                            piszTeczkaUsunięta(poziom, "</>");
                            piszTeczkaWtórna(poziom, "</>");
                        }
                    }
                }
            }
            { //wypisz wtórne teczki
                foreach (string teczkiName in teczkiNames)
                {
                    bool isTeczkiNameInWykaz = false;
                    for (int i = 0; i < wkzTeczkiNames.Length; i++)
                    {
                        if (teczkiName == wkzTeczkiNames[i])
                        {
                            isTeczkiNameInWykaz = true;
                            break;
                        }
                    }
                    if (!isTeczkiNameInWykaz)
                    {
                        piszTeczkaWtórna(poziom, teczkiName);
                    }
                }
            }
        }