C# вызвать Win32 API для длинных путей к файлам?

Как мне вызвать Win32 API для длинных путей к файлам, единственное, что я хочу сделать, - это получить список всех файлов в этом каталоге (рекурсивно)

1 ответ

Решение

Если вы хотите использовать вызовы Win32, вам сначала нужно будет использовать DllImport для импорта ядра, синтаксис выглядит примерно так, и вы должны делать это для каждого метода, который вы хотите использовать (это весь не проверенный псевдокод, который только описывает концепцию), пример кода преобразует ваши пути в пути UNC, чтобы вы могли иметь длинные пути к файлам:

    using Microsoft.Win32.SafeHandles;
    ...
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            static extern SafeHandleMinusOneIsInvalid FindFirstFileW(string lpFileName, IntPtr lpFindFileData);

    ...

            public String FindFirstFile(string filepath)
            {
                // If file path is disk file path then prepend it with \\?\
                // if file path is UNC prepend it with \\?\UNC\ and remove \\ prefix in unc path.
                if (filepath.StartsWith(@"\\"))
                    filepath = @"\\?\UNC\" + filepath.Substring(2, filepath.Length - 2);
                else
                    filepath = @"\\?\" + filepath;
...
                SafeHandleMinusOneIsInvalid ret = FindFirstFileW(filepath, lpFindFileData);
...
            }

После вызова FindFirstFile необходимо вызвать FindNextFile для следующего файла в каталоге, а затем, наконец, FindClose; для полного примера о том, как перечислить файлы в каталоге, используя ядро ​​Win32, посмотрите здесь

Другие вопросы по тегам