private void CopyDir(string SourceDir, string TargetDir)
{
    string[] Files;
    FileAttributes Attr;
    string srcFile;

    // sprawdzenie czy na końcu ścieżki znajduje się separator \ 
    if (!SourceDir.EndsWith(Path.DirectorySeparatorChar.ToString()))
    {
        SourceDir += Path.DirectorySeparatorChar;
    }
    if (!TargetDir.EndsWith(Path.DirectorySeparatorChar.ToString()))
    {
        TargetDir += Path.DirectorySeparatorChar;
    }
    // pobranie lsity plików z katalogu
    Files = Directory.GetFileSystemEntries(SourceDir);
    // utworzenie katalogu docelowego
    Directory.CreateDirectory(TargetDir);

    for (int i = 0; i < Files.Length; i++)
    {
        // pobranie atrybutu pliku
        Attr = File.GetAttributes(Files[i]);
        // pobranie nazwy pliku
        srcFile = Path.GetFileName(Files[i]);

        // warunek sprawdza czy plik jest katalogiem? 
        if (FileAttributes.Directory == Attr)
        {
            if (!Directory.Exists(TargetDir + srcFile))
            {
                Directory.CreateDirectory(TargetDir + srcFile);
            }
            // wywołanie rekurencyjne
            CopyDir(Files[i], TargetDir + srcFile);
        }
        else
        {
            // skopiowanie pliku z katalogu
            File.Copy(Files[i], TargetDir + srcFile);
        }
    }
}