Я создаю приложение командной строки Haskell в Windows 10 и пытаюсь отладить проблему, связанную с ограничением пути к файлу Windows в 260 символов, отслеживая системные вызовы и выявляя, какие из них терпят неудачу.
Я использовал procmon (https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) для этого, что кажется довольно хорошим, но, хотя он отображает много связанных записей журнала, я был удивлен, обнаружив, что он не отображает запись для конкретного вызова CreateFileW, который фактически превышает 260 символов и вылетает мое приложение.
Я ненадолго попробовал Win32 API Monitor (https://www.apimonitor.com), но не смог понять или хвосты его; кажется, что он лучше подходит для подключения к уже запущенным приложениям с графическим интерфейсом, чем к приложениям командной строки, которые необходимо запускать в определенном каталоге и т. д.
Есть ли лучшая альтернатива им или лучший подход?
MAX_PATH
существует из-за того, как библиотеки пользовательского режима транслируют пути из DOS в собственный NT. Он использовался для совместимости с устаревшими приложениями, но также позволял безоговорочно использовать относительно небольшие статические (для каждого потока) буферы перевода, которые были более эффективны, чем динамические строки в начале 90-х, когда это имело значение. - person Eryk Sun   schedule 27.09.2019GetFullPathNameW
и преобразовать результат в путь к устройству. Последний начинается с каталога объектов вызывающей стороны для соединения устройств. В Windows есть два префикса для этого каталога объектов — \\.\ нормализуется, а \\?\ не нормализуется для создания/открытия. Вам нужен ненормализованный префикс, например. \\?\С:\Виндовс. Если путь уже начинается с \\.\, просто замените его на \\?\. Если это UNC, но не путь к устройству, например \\server\share, явно преобразуйте его в соединение устройств UNC, например. \\?\UNC\сервер\общий ресурс. - person Eryk Sun   schedule 27.09.2019MAX_PATH
можно избежать, не прибегая к\\?\
или\\?\UNC\
или путям устройств, но поведение должно включаться вручную, подробности см. в MSDN. - person Remy Lebeau   schedule 27.09.2019MAX_PATH
, потому что он нормализуется в контексте создания или открытия, чтобы заменить косую черту обратной косой чертой и обрезать конечные пробелы и точки из конечного компонента. \\?\ обходит нормализацию в контексте создания или открытия. Это обход нормализации и трансляции путей DOS, от которого мы зависим при использовании \\?\ путей устройств, потому что это то, что ограниченоMAX_PATH
, если длинные пути DOS не поддерживаются в текущем процессе. - person Eryk Sun   schedule 27.09.2019