Primo Chalice Ответов: 1

Как реплицировать исходную структуру папок в C#?


- Привет!

Я импортирую XML-файлы, указывая путь к файлу в текстовом поле и сохраняя xml-файл в другом каталоге.

Я хочу, чтобы при сохранении файла исходный каталог пути к файлу и подкаталоги (без файлов, только папки) были реплицированы, а окончательный вывод xml-файла находился в папке с именем Output.

Например:

Исходный Путь К Файлу:

Folder1 -> Folder11, Folder12, Folder13
Folder13 -> File1, File2, File3

Выходной Путь К Файлу:

Folder1 -> Folder11, Folder12, Folder13
Folder13 -> Output -> File1, File2, File3

Пожалуйста помочь.

Надеюсь, я смог объяснить.

С уважением
Аман

Что я уже пробовал:

Я сохраняю несколько xml-файлов, заменяя исходные в настоящее время.

Maciej Los

Мы знаем, чего ты хочешь, но в чем твоя проблема?

Primo Chalice

- Привет!

Все мои предыдущие проблемы вроде как решены. Это та проблема, с которой я сталкиваюсь в настоящее время. Просто реплицируйте и создавайте исходную структуру папок, как показано в вопросе. Без цикла foreach предпочтительнее.

С уважением
Аман

1 Ответов

Рейтинг:
0

OriginalGriff

По странному совпадению, я только что сбил приложение резервного копирования / восстановления сегодня утром (после того, как поднял свои DOOM savegames на один и тот же уровень в третий раз за два дня...)

/// <summary>
/// Backup save games
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void butBackup_Click(object sender, EventArgs e)
    {
    if (EnsureFoldersExist(saveGamePath, backupSaveGamePath))
        {
        CopyFolder(saveGamePath, backupSaveGamePath);
        }
    }
/// <summary>
/// Restore save games
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void butRestore_Click(object sender, EventArgs e)
    {
    if (EnsureFoldersExist(backupSaveGamePath, saveGamePath))
        {
        CopyFolder(saveGamePath, backupSaveGamePath);
        }
    }

/// <summary>
/// Copy a folder from one place to another.
/// </summary>
/// <param name="source"></param>
/// <param name="destination"></param>
private void CopyFolder(string source, string destination)
    {
    try
        {
        DirectoryInfo dir = new DirectoryInfo(source);
        if (!dir.Exists) throw new DirectoryNotFoundException("Source directory does not exist or could not be found: " + source);
        if (!Directory.Exists(destination)) Directory.CreateDirectory(destination);
        // Copy files
        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
            {
            string temppath = Path.Combine(destination, file.Name);
            file.CopyTo(temppath, true);
            }
        //Copy folders
        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (DirectoryInfo subdir in dirs)
            {
            string temppath = Path.Combine(destination, subdir.Name);
            CopyFolder(subdir.FullName, temppath);
            }
        }
    catch (Exception e)
        {
        MessageBox.Show("Unable to copy data.\nThe error reported is\n   \"" + e.Message + "\"", "Problem with required folders", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

/// <summary>
/// Ensure input and output folders exist.
/// </summary>
/// <param name="source"></param>
/// <param name="destination"></param>
/// <returns>True if folders exist OK</returns>
private bool EnsureFoldersExist(string source, string destination)
    {
    if (!Directory.Exists(source))
        {
        MessageBox.Show("Input path does not exist:\n   " + source, "Problem with required folders", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return false;
        }
    if (!Directory.Exists(destination))
        {
        // Create it.
        try
            {
            Directory.CreateDirectory(destination);
            }
        catch (Exception e)
            {
            MessageBox.Show("Unable to create output path:\n   " + destination + "\nThe error reported is\n   \"" + e.Message + "\"", "Problem with required folders", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
            }
        }
    return true;
    }
Все, что вам нужно сделать, это вырвать часть копии файла.


Maciej Los

5ed!

OriginalGriff

Три раза за два дня, на одном и том же чертовом уровне. Я явно не очень быстро учусь ... и я ненавижу систему "контрольных точек". :смеяться:

Maciej Los

:большой палец вверх: