C# Как скопировать файл без изменения исходного имени файла

У меня есть этот код:

var GetDLLFilesForDir = Directory.GetFiles(directory, "*.dll", SearchOption.AllDirectories).Where(s => s.EndsWith(".dll"));
foreach (string DLLFilesForDir in GetDLLFilesForDir)
{
    File.Copy(DLLFilesForDir, Path.Combine(SADIR, DLLFilesForDir), true);
}

Но, как видите, когда я копирую его, я получаю сообщение об ошибке. Я знаю, что ошибка вызвана «DLLFilesForDir», потому что он пытается объединить путь, используя «DLLFilesForDir», когда я уже использую этот файл.

Проблема в том, что мне нужно, чтобы имя файла оставалось прежним, поэтому, если я изменю:

Path.Combine(SADIR, DLLFilesForDir);

К этому:

Path.Combine(SADIR, DLLFilesForDir + "1");

Будет ли изменено имя копируемого файла, потому что тогда у меня будет «filename1.dll» вместо «filename.dll», и мне нужен последний.

Помощь приветствуется, спасибо.


person user2784566    schedule 19.09.2013    source источник
comment
Можете ли вы быть более ясным. Почему копия не работает? Потому что DLL уже загружена в процесс? Если это так, то вам просто нужно убедиться, что все, что загружено, сначала выгружается.   -  person David Heffernan    schedule 19.09.2013
comment
Проблема в том, что каталог назначения не существует? Попробуйте Debug.WriteLine(Path.Combine(SADIR, DLLFilesForDir)) чтобы увидеть назначение.   -  person Neil    schedule 19.09.2013
comment
Я получаю сообщение об ошибке: процесс не может получить доступ к файлу filename.dll, потому что он используется другим процессом, он не используется никаким другим процессом, кроме моей собственной программы.   -  person user2784566    schedule 19.09.2013
comment
Вероятно, вы получите ответ здесь, но в будущем вы сможете отладить такую ​​проблему с помощью отладчика за минуту самостоятельно. Ознакомьтесь с ним.   -  person usr    schedule 19.09.2013


Ответы (1)


Измените свой

File.Copy(DLLFilesForDir, Path.Combine(SADIR, DLLFilesForDir), true);

to

File.Copy(DLLFilesForDir, Path.Combine(SADIR, Path.GetFileName(DLLFilesForDir)), true);


Со страницы MSDN для Путь.Объединить():

Если path2 содержит абсолютный путь, этот метод возвращает path2.

Итак, вы пытаетесь скопировать файл на себя ^^

person Raidri    schedule 19.09.2013
comment
Я пытаюсь скопировать файл в каталог\папку, существует он или нет, это не имеет значения, потому что он будет перезаписан. - person user2784566; 19.09.2013
comment
Ваш Path.Combine(SADIR, DLLFilesForDir) возвращает DLLFilesForDir, потому что это абсолютный путь. Таким образом, вы получаете File.Copy(DLLFilesForDir, DLLFilesForDir, true);, который не работает. Попробуйте предложенное мной изменение. - person Raidri; 19.09.2013