C # System.IO.File.Copy проблема - PullRequest
1 голос
/ 21 марта 2019

Итак, мне нужно было создать быстрое приложение Windows Form, чтобы обработать список файлов с их каталогами и скопировать их в новый каталог. Обычно для этого я бы использовал командный файл, например,

@echo off
mkdir "C:\Users\%username%\Desktop\inst"

:A
ping 127.0.0.1 -n 1 > nul
xcopy "C:\Users\%username%\Desktop\M14.0.1512.400-enu-x64.exe" "C:\Users\%username%\Desktop\inst" /y
xcopy "C:\Users\%username%\AppData\Local\Temp\vcredist.exe" "C:\Users\%username%\Desktop\inst" /y

GOTO A

Я знаю, что не использую лучшие практики и т. Д., Но это быстрый сценарий, который я придумал, чтобы ускорить мою работу. Теперь сделать это для пары файлов - это хорошо, но некоторые из приложений, над которыми я работаю, имеют более 40 файлов, которые мне нужно скопировать, и это немного затрудняет необходимость писать командный файл каждый раз.

Итак, я добавил простое WF-приложение с простым полем ввода и кнопкой, чтобы начать процесс.

Пользователь помещает список файлов (с путем и каталогом, например, C: \ foo \ bar \ hello.txt) в поле ввода, а затем приложение берет каждую строку из текстового поля и помещает ее в список после делать некоторую базовую фильтрацию, например удаление \ n, \ t, \ r и инкапсуляция строк двойными кавычками, если они еще не на месте.

new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;

while (run)
{
    foreach (string path in paths)
    {
        Thread.Sleep(100);
        try
        {
            File.Copy(path, dir, true);
        }
        catch (Exception e)
        {
            g.log.WriteToLog("Failed to copy asset: " + e.ToString());

        }
    }
};

}).Start();

Когда я запускаю, вот что я получаю в логах:

//LOGS
21/03/2019 11:25:56  -  Failed to copy asset: System.ArgumentException: Illegal characters in path.   at System.IO.LongPathHelper.Normalize(String path, UInt32 maxPathLength, Boolean checkInvalidCharacters, Boolean expandShortPaths)   at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)   at System.IO.Path.GetFullPathInternal(String path)   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)   at S2_PackagingTool.Application_Extractor.ExtractAssets() in C:\Users\xxxx\Desktop\GitHub\S2-EnvPrepTool\Application_Extractor.cs:line 98
21/03/2019 11:25:56  -  Path: "C:\Program Files\Freedom Scientific\Runtime JAWS\18.0\jrt.exe" Dir: "C:\Users\xxxx\Desktop\GitHub\S2-EnvPrepTool\bin\Debug\Extracted Assets"

Вторая строка в журналах - это дамп значения из переменных path и dir.

Когда я запускаю код без цикла while, добавляю путь и dir вручную, например,

File.Copy(@"C:\foo\bar\hello.txt", @"C:\hello\world", true);

или

File.Copy("C:\\foo\\bar\\hello.txt", "C:\\hello\\world", true);

Работает нормально.

Я также включу метод фильтра, если вы, ребята, захотите его увидеть. Имейте в виду, это быстро и грязно, так что да:

public string QuoteEncapsulationFilter(string s)
{
    s = s.Replace("\n", String.Empty);
    s = s.Replace("\r", String.Empty);
    s = s.Replace("\t", String.Empty);
    s = s.Replace("\\", "\\\\");

    if (!s.Contains("\""))
    {
        s = "\"" + s + "\"";
    }

    return s;
}

Я пытался найти ответ везде, но не повезло, может кто-нибудь, пожалуйста, может пролить немного света на то, что я делаю не так, пожалуйста. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

1 голос
/ 21 марта 2019

Вам не хватает имени файла в функции File.Copy (string sourceFileName, string destFileName, bool overwrite);. Для вашего dir пути требуется имя файла.

https://docs.microsoft.com/en-us/dotnet/api/system.io.file.copy?view=netframework-4.7.2

говорит следующее:

DestFileName String Имя файла назначения. Это не может быть каталог.

Edit: Чтобы ответить на ваш второй вопрос в комментариях:

new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;

while (run)
{
    foreach (string path in paths)
    {
        Thread.Sleep(100);
        try
        {
            var fileName = Path.GetFileName(path); // Get the file name
            var fullDestination = dir + fileName;  // Complete the uri
            File.Copy(path, fullDestination, true);
        }
        catch (Exception e)
        {
            g.log.WriteToLog("Failed to copy asset: " + e.ToString());

        }
    }
};

}).Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...