C# winforms получают n-ые папки из пути - PullRequest
0 голосов
/ 06 апреля 2020

Мне доступен абсолютный путь. Скажите: C:/Program/CoreFiles/Folder1/Folder2/File.txt.

Мне нужно скопировать этот файл в C:/Program/Projects/ProjectName/, но он должен сохранить Folder1/Folder2/File.txt в целости и сохранности. Таким образом, конечный результат должен быть C:/Program/Projects/ProjectName/Folder1/Folder2/File.txt.

Моя первая попытка решить эту проблему состояла в том, чтобы попытаться получить относительный путь между двумя абсолютными путями. Найден Path.GetRelativePath (string, string) , который, очевидно, не помог, так как он не предназначен для WinForms. Это все равно испортит, так как конечный результат будет C:/Program/Projects/ProjectName/CoreFiles/Folder1/Folder2/File.txt.

Целевой каталог пуст, и я заранее не знаю относительный путь для копирования, кроме как каким-то образом получить эту информацию из абсолютного пути. Поскольку File.Copy не будет создавать папки, которые еще не существуют, мне нужно сначала создать их. Итак, как мне получить путь, ведущий к файлу из каталога CoreFiles по абсолютному пути?

Единственное рабочее решение, которое я могу придумать, - это использовать regex, чтобы просто заменить CoreFiles на Projects/ProjectName в строке пути и работа с этим. Но это как-то кажется неправильным подходом.

1 Ответ

1 голос
/ 06 апреля 2020

Так как вы не можете использовать Path.GetRelativePath. Я предлагаю посмотреть на другой ответ, который описывает, как сделать это самостоятельно. Как здесь ...

Используя метод в этом ответе, вы можете сделать остальное Ваша задача, как показано ниже.

string sourcePath = "C:/Program/CoreFiles/Folder1/Folder2/File.txt";
string sourceRoot = "C:/Program/CoreFiles/";
string destinationRoot = "C:/Program/Projects/ProjectName/";

// Use built-in .NET Path.GetRelativePath if you can. Otherwise use a custom function. Like here https://stackoverflow.com/a/340454/1812944
string relativePath = MakeRelativePath(sourceRoot, sourcePath);

// Combine the paths, and make the directory separators all the same. 
string destinationPath = Path.GetFullPath(Path.Combine(destinationRoot, relativePath));

// Create nested folder structure for your files. 
Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));

// Copy the file over. 
File.Copy(sourcePath, destinationPath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...