Что не так с моим вызовом WINAPI для обработки длинных путей к файлам? - PullRequest
2 голосов
/ 12 февраля 2009

Я пытался найти лучший способ скопировать файлы в Windows с глубокими путями (файлы, а не папки, так что о Robocopy не может быть и речи). Лучшее решение, которое я смог найти, - это написать собственное решение. Я смог написать код для обработки списков каталогов с 10 000 символьных путей, но использование того же подхода, похоже, не работает для фактического копирования файлов. Я устал от использования библиотек System.IO с префиксом \? \ К путям, и это, похоже, не сработало.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFile(string lpExistingFileName, string lpNewFileName,
   bool bFailIfExists);

public static bool CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    return CopyFile(source, dest, false);
}

private static string fixPathForLong(String path)
{
    if (!path.StartsWith(@"\\?\"))
        path = @"\\?\" + path;
    return path;
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2009

Стоит ли вместо этого вызывать функцию CopyFileW? Обратите внимание на букву W в конце. Кроме того, я не знаю, используете ли вы пути UNC. Если так, то вместо этого вам нужно использовать префикс «\\? \ UNC \».

Это хорошая статья для обработки длинных путей

http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

2 голосов
/ 12 февраля 2009

Если вызов CopyFile (не ваша перегрузка, объявление P / Invoke) возвращает false, я бы выбросил Win32Exception:

public static void CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    if (!CopyFile(source, dest, false))
    {
        throw new Win32Exception();
    }
}

Конструктор по умолчанию для класса Win32Exception вызовет GetLastError и предоставит вам более подробную информацию об ошибке, объясняющую причину сбоя операции.

...