В дополнение к на этот ответ У меня есть еще одна проблема. Я пишу Free Pascal, но решения Delphi, вероятно, будут работать.
Вкратце, у меня есть строковое значение объединенных путей, которое формируется путем взятия исходного каталога и воссоздания этого дерева в конечном каталоге. например,
C: \ SourceDir \ SubDirA
становится
F: \ DestinationDir \ SourceDir \ SubDirA.
Однако, решение, которое я имею для версии моей программы для Linux (как опубликовано в ссылке выше), не совсем работает с версией Windows, потому что я в итоге:
F: \ DestionationDir. \ C: SourceDir \ SubDirA
, что недействительно.
Итак, я придумал этот код «только для запуска в Windows», чтобы удалить центральную букву преобразованного пути, но оставил начальную букву в начале, сказав: «Посмотрите на строку, начиная с 4-го символа слева Если вы найдете «C:», удалите его «, чтобы путь стал F: \ DestinationDir \ SourceDir \ SubDirA.
{$IFDEF Windows} // Only do this for the Windows version
k := posex('C:', FinalisedDestDir, 4); // Find 'C:' in the middle of the concatanated path and return its position as k
Delete(FinalisedDestDir, k, 2); // Delete the 2 chars 'C:' of 'C:\' if found, leaving the '\' to keep the path valid
{$ENDIF}
Теперь это работает нормально, если C: является источником выбранного каталога. Но очевидно, что если пользователь копирует данные с другого диска (например, E :, F :, G: или любого другого диска до Z :), он не будет работать.
Итак, мой вопрос: как мне закодировать его так, чтобы оно гласило: «Если после 4-го символа слева будет найдена буква диска a: to z:, удалите ее»? Хотя любое решение, которое работает, «подойдет», в идеале мне нужно быстрое решение. Лучшее решение было бы, во-первых, не иметь его там, но, учитывая решение, которое я разместил в ответ на мое предыдущее сообщение, я не могу понять, как его не использовать из-за процедуры, которую я использую для формирования Это.